try! Swift 最速レポート 3日目午前 #tryswiftconf

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

弊社のレポートは以下になります

昨日の午後の部の田中孝明から引き続きお送りいたします。

try! Swift 最速レポート 3日目午前

こんにちは!朝のコーヒーが欠かせない田宮です!

今日もマークシティーからお届けしています! Swift開発者たちの大規模なカンファレンス・try!swiftにやって来ました!! 今日はいよいよ最終日。Developers.IOでは、この模様を随時お届けしていきます!このイベントでは世界中のSwiftデベロッパーが一堂に会しています。知識や技術を互いに共有し高め合うことを目的としています。

目次

Motivation based libarry abstraction

Server Side Swift

Swiftにおける実践的なモック化について

Swiftヒップスター

Core Imageによる高度な画像処理

ランチ!

Motivation based library abstraction

IMG_0245

発表者:Hiroki Katoさん

はてなのシニアエンジニアの Hiroki Kato さん。自らが作られた便利コンポーネントについて、お話されました。

レポート

必要は発明の母

  • はてなのアプリはSwiftのみで書かれている
  • ブログやSNSケイあぷりはSwiftになった
  • Swiftインターンシップ・社内教育用に教科書をWebで公開した

UTIKit

  • ブログのアプリのサービス
  • 綺麗な写真を載せたいけど、画像形式もいろいろ。
  • Photos.framework の実装で出てくる、UTI
    • Uniform Type Idetifier
    • 画像の種類(jpegとか)を指定
  • MIME Type → UTI
  • Equalityもカンタンに検査可能

HUDKit

  • ユーザーがブログ記事を投稿した時、ユーザーは直ぐ見たいけど、ちょっと通信中待って貰う必要
  • Twitter/FBにシェアする時、「シェアしますか?」って聞いたあげたい
  • 画面の真ん中にHUDを出すのよくある
  • HUDはユーザー操作に割り込みたい時に使う
  • HUDKit
    • どんなVCでもHUDで表示できる
    • UIPresentationController
      • present, transition を管理
    • 2つのクラス
      • HUDProgressViewController
      • HUDPresentationViewController

HTTPRequestMatcher(公開前)

  • URLのパスから画面を組み立てて表示
  • Handling Universal Links
  • URLからどうViewControllerをつくるか
  • パスの文字列をみる
    • アスタリスクを使うとなんにでもマッチ
    • :name {name} 名前で取り出せる
    • 正規表現にマッチした時だけ、適合している、とすることが出来る
  • Path Matcher + Method Matcher = Request Matcher

モチベ駆動の Library absraction

IMG_9803

  • 自分にとって、役に立つライブラリを作った。けど、皆さんにも使いやすいかも
  • コードを再利用するため、なるべく抽象的に問題を扱うようにしている
  • @IBDesignable
    • 会社のデザイナーの方が簡単に、デザイン、例えばUILabelの行間を変えるようにしている。コード再利用の一例

Swiftは絶賛変化中

  • New API Guidlines(Accepted today!!)
    • SE-0005, SE-0006, SE-0023
  • SE-0030
    • Property Behaviors (Under revision)
    • 書き方結構変わるんだけど、もうチョット議論されている などなど

まとめ

  • Write apps
  • Share your code
    • ライブラリを作ってコードシェアするのも良い
  • Change the world!

  • はてなでは、仕事の中で作ったものを、チョト相談して、自分のリポジトリで公開して良いガイドライン。

  • 他の会社の受託としてやる場合は、もちろんダメだけど、あらかじめ予想して、日曜に先回りに公開しておきます(笑)
  • 「そうだ丁度いいライブラリがあります!」

Server Side Swift

IMG_0247

発表者: Caesar Wirth さん

レポート

  • Swiftでサーバサイドを書く
  • クライアントサイドからHTTP Request
  • RubyのSinatra, node.jsの Express は型が意識しなくてもいいですよね(動的型付け)
    • でも、私は型が大好きですwww。Swiftでは型システムがある。
  • クライアントがデータをサーバに送り、サーバからレスポンスが返る
    • それらをtypealiasで定義。
  • いろんな型のレスポンス
    • JSON, HTML ,ERRORs

じつは

  • APIサーバを作るのには、ソケットのリスニング、コネクション、などいろんな要素がある
  • Nest, Curassow, Jay という素晴らしいコンポーネントがある
    • ソケット、JSONのパースなどにはこれらを使っています。
  • アプリの実装と他を切り離せる

デモ

router.get("/pokemon") { request in
    let pokemonJson = try pokedex.jsonString()
    return Response(status: .OK, body: pokemonJson)

router.post("/pokemon") { request in
    guard let json = request.body else {
        return Error.Badrequest
}
  • デモ
    • 実際にローカルでポケモンずかん稼働させてみた
    • GET/POSTを実装し、実際にポケモン一覧を表示できた!!!

リリースするときは

IMG_9838

  • ここまでは、ローカルホストで動かしてた
  • Herokuをつかう
  • swiftenv, .swift-version file定義, Procfile(Herokuの設定ファイル)作成, Herokuアプリケーションの作成, そしてデプロイ!
  • デモ:プロダクション環境のものが出来た!
  • 最終的にポケモンデータが表示できた!!

Swiftにおける実践的なモック化について

IMG_0290

Swift時代のモックについて、お話されました。実装方法から、もう少し広げて、テストやモックとどう付き合っていけばいいか、と言ったお話もありました。

発表者: Veronica Ray さん

レポート

  • テスト
    • 非同期のテストは時間がかかるし信頼性がない
    • OCMockはさほど有用ではない。あまり機能が提供されていない
    • Swift用には自分でモックを作らねばならない状況
    • テストに時間がかからない方法を教えます。

モック必要な場合

  • 価値があると思った時のみ、モックを作る
      1. テストがとても早く終わらせられる場合
      1. カバレッジ
      1. テストをより堅牢に出来る場合
  • リファクタリングをする時、自信をもってできるようになる

  • 開発の時テストをまず考えたほうがいい
  • いつやるの?いまでしょ!

  • プログラム、書いた後すぐは覚えてるからデバッグしやすいけど、あとになればなるほど忘れる。

  • 記憶が新しいうちにテストを書いたほうがいい。今書くべき。
  • チームとして、テストの文化を作る必要。

Injections

  • DI(Dependency Injection)

    • シングルトンでいいのでは?
    • なぜ dependency injection?
      • カスタマイズ簡単
      • 所有者が明確
      • テストしやすい
  • Constractor Injection
    • TYpes of test doubles
      • Stubs
      • Mocks
      • Partial mocks

その他

IMG_0324

  • チェック用のURLをハードコーディングする方法
  • 部分的モック
    • アンチパターンである
    • セットアップも大変
    • comprehesibilityを損なう
  • プロトコルとSwiftのモック
    • WWDCでプロトコル指向のはなし
    • モックが性質上脆いという。
    • don't mock types
  • Apple フレームワークのクラス
    • モックが複雑
  • 良いモックの条件は、早く簡単にかけることなど

  • imperial shell

Swiftヒップスター

IMG_9841

悟空の格好で現れた Hectorさん。Swift開発者があまり知らない便利ないろいろを発表されました。

発表者: Hector Matos さん

レポート

today's topics

  • @noescape
  • @autoclosure
  • lazy vars
  • variadic parameters
  • labeled loops
  • type omitting

@noescape

  • クロージャを関数に渡す時
  • escapeさせない
  • escapeしてはいけないものに関してはエラーを出してくれる
  • noescapeのクロージャーは、その場で即時実行するか、別のnoescapeクロージャーを受け取る関数/メソッドに渡さなければならない

@autoclosure

  • closureを挿入関数に渡すのでなく、Boolを渡している
  • @autoclosureは@noescapeクロージャーを自動的につくってくれる

lazy vars

lazy var kamehameha: KiAttack = {
     // かめはめ波を打つのには時間がかかる
     // だから変数をLazyにしたい。
     // 物語が始まるごとにいちいちエネルギーをためたくない
     // 世界を救うのだから!
     return self.chargeAndReleaseAKamehameha()
 }

これが、こうなる

lazy var kamehameha: KiAttack = self.chargeAndReleaseAKamehameha()
class Goku: ZFighter {
    lazy var kamehameha: KiAttack = self.chargeAndReleaseAKamehameha()

    func chargeAndReleaseAKamehameha() -> KiAttack {
        return KiAttack()
    }

    deinit {
        print("deinit is called")
    }
}

var goku: Goku? = Goku()
goku?.kamehameha.attackEnemy()
goku = nil

美しい。ただ美しい!

labeled loops

IMG_9840

enemyFightLoop: for enemyAttack in enemy.listOfAttacks {
     heroFightLoop: for heroAttack in hero.listOfAttacks {
        if heroAttack.power > enemyAttack.power && completedEpisodes.count > 5 {
     winner = hero
    break enemyFightLoop
 }
}
  • ループに名前をつける
  • Swift1.2で一版エキサイト

type omitting

  • タイプを省略
func changeSaiyanHairColorTo(color: UIColor) {
 saiyan.hairColor = color
}
if saiyan.isSuperSaiyan {
 changeSaiyanHairColorTo(UIColor.yellowColor())
} else {
 if saiyan.name == "Trunks" {
 changeSaiyanHairColorTo(UIColor.purpleColor())
 } else {
 changeSaiyanHairColorTo(UIColor.blackColor())
 }
}
if saiyan.isSuperSaiyan {
 changeSaiyanHairColorTo(.yellowColor())
} else {
 if saiyan.name == "Trunks" {
 changeSaiyanHairColorTo(.purpleColor())
 } else {
 changeSaiyanHairColorTo(.blackColor())
 }
}
struct PowerLevel {
 let value: Int
 static func determinePowerLevel(_ fighter: ZFighter) -> PowerLevel
}
func powerLevelIsOver9000(powerLevel: PowerLevel) -> Bool {
 return powerLevel.value > 9000
}
//Type omission!
if powerLevelIsOver9000(.determinePowerLevel(goku)) {
 print("It's over 9000!")
}
if saiyan.isSuperSaiyan {
 changeSaiyanHairColorTo(UIColor.yellowColor())
} else {
 if saiyan.name == "Trunks" {
 changeSaiyanHairColorTo(UIColor.purpleColor())
 } else {
 changeSaiyanHairColorTo(UIColor.blackColor())
 }
}
if saiyan.isSuperSaiyan {
 changeSaiyanHairColorTo(.yellowColor())
} else {
 if saiyan.name == "Trunks" {
 changeSaiyanHairColorTo(.purpleColor())
 } else {
 changeSaiyanHairColorTo(.blackColor())
 }
}

Core Imageによる高度な画像処理

IMG_0382

Core Imageを使った、様々なエフェクトの紹介とその実装方法をお話されました。

発表者: Simon Gladman さん

レポート

Core Imageとは

IMG_0401

  • 画像処理フレームワーク
  • 170個のフィルタ内蔵
  • カスタムフィルタも作れる
  • 顔認識、QRコードなど
  • SceneKit SpriteKitに統合

主要クラス

  • CIKernenl
  • CIFiler
  • CIImage
  • CIContext etc.

IMG_9885

IMG_9859

様々な画像加工の例をプレゼンテーションされていきました。

ランチ!

IMG_9787

今日も、豪華弁当が沢山!スターバックスのコーヒーやラップも!豪華!

まとめ

最終日の午前もとても盛り沢山の内容でした。 急遽代打で発表されたサーバーサイドSwiftについては、ホットトピックであり、大変興味深かったです。 また、今日から試せるHowTo系のものや、ライブラリについても沢山発表があったのが印象的でした。 最終日午後の記事は、田中孝明が引き続きお届けします!!