try! Swift 最速レポート 3日目午前 #tryswiftconf
弊社のレポートは以下になります
- try! Swift 最速レポート 1日目午前
- try! Swift 最速レポート 1日目午後
- try! Swift 最速レポート 2日目午前
- try! Swift 最速レポート 2日目午後
- try! Swift 最速レポート 3日目午後
昨日の午後の部の田中孝明から引き続きお送りいたします。
try! Swift 最速レポート 3日目午前
こんにちは!朝のコーヒーが欠かせない田宮です!
今日もマークシティーからお届けしています! Swift開発者たちの大規模なカンファレンス・try!swiftにやって来ました!! 今日はいよいよ最終日。Developers.IOでは、この模様を随時お届けしていきます!このイベントでは世界中のSwiftデベロッパーが一堂に会しています。知識や技術を互いに共有し高め合うことを目的としています。
目次
Motivation based libarry abstraction
Motivation based library abstraction
発表者: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
- 自分にとって、役に立つライブラリを作った。けど、皆さんにも使いやすいかも
- コードを再利用するため、なるべく抽象的に問題を扱うようにしている
- @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
発表者: 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を実装し、実際にポケモン一覧を表示できた!!!
リリースするときは
- ここまでは、ローカルホストで動かしてた
- Herokuをつかう
- swiftenv, .swift-version file定義, Procfile(Herokuの設定ファイル)作成, Herokuアプリケーションの作成, そしてデプロイ!
- デモ:プロダクション環境のものが出来た!
- 最終的にポケモンデータが表示できた!!
Swiftにおける実践的なモック化について
Swift時代のモックについて、お話されました。実装方法から、もう少し広げて、テストやモックとどう付き合っていけばいいか、と言ったお話もありました。
発表者: Veronica Ray さん
レポート
- テスト
- 非同期のテストは時間がかかるし信頼性がない
- OCMockはさほど有用ではない。あまり機能が提供されていない
- Swift用には自分でモックを作らねばならない状況
- テストに時間がかからない方法を教えます。
モック必要な場合
- 価値があると思った時のみ、モックを作る
-
- テストがとても早く終わらせられる場合
-
- カバレッジ
-
- テストをより堅牢に出来る場合
-
- リファクタリングをする時、自信をもってできるようになる
- 開発の時テストをまず考えたほうがいい
-
いつやるの?いまでしょ!
-
プログラム、書いた後すぐは覚えてるからデバッグしやすいけど、あとになればなるほど忘れる。
- 記憶が新しいうちにテストを書いたほうがいい。今書くべき。
- チームとして、テストの文化を作る必要。
Injections
-
DI(Dependency Injection)
- シングルトンでいいのでは?
- なぜ dependency injection?
- カスタマイズ簡単
- 所有者が明確
- テストしやすい
- Constractor Injection
- TYpes of test doubles
- Stubs
- Mocks
- Partial mocks
- TYpes of test doubles
その他
- チェック用のURLをハードコーディングする方法
- 部分的モック
- アンチパターンである
- セットアップも大変
- comprehesibilityを損なう
- プロトコルとSwiftのモック
- WWDCでプロトコル指向のはなし
- モックが性質上脆いという。
- don't mock types
- Apple フレームワークのクラス
- モックが複雑
- 良いモックの条件は、早く簡単にかけることなど
- imperial shell
Swiftヒップスター
悟空の格好で現れた 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
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による高度な画像処理
Core Imageを使った、様々なエフェクトの紹介とその実装方法をお話されました。
発表者: Simon Gladman さん
レポート
Core Imageとは
- 画像処理フレームワーク
- 170個のフィルタ内蔵
- カスタムフィルタも作れる
- 顔認識、QRコードなど
- SceneKit SpriteKitに統合
主要クラス
- CIKernenl
- CIFiler
- CIImage
- CIContext etc.
様々な画像加工の例をプレゼンテーションされていきました。
ランチ!
今日も、豪華弁当が沢山!スターバックスのコーヒーやラップも!豪華!
まとめ
最終日の午前もとても盛り沢山の内容でした。 急遽代打で発表されたサーバーサイドSwiftについては、ホットトピックであり、大変興味深かったです。 また、今日から試せるHowTo系のものや、ライブラリについても沢山発表があったのが印象的でした。 最終日午後の記事は、田中孝明が引き続きお届けします!!