try swift 2018 tokyo day 1 参加メモ
try swift 2018 tokyo 1日目の参加メモです。
裏 Swift Tour
- 以下の順で紹介
- 値への代入
- オプショナルな値への代入
- Closure
- enum
- Never
- inout
- return
- didSet
- defer
- init, deinit
以下、気になった点のみメモ
- オプショナルな値への代入を使って、成功時のみ処理を実行する事ができる
(obj.v = 10)?.map { /* do */ }
- int?にintを足し算できない。一度アンラップしなければならない。
- 自前でint?にintを足し算するoperationを追加できる
- Int!を使っているところでIntを使うテクニック
- inoutの挙動 - didSetがある変数を渡すとコピーが渡され、inoutの関数の最後に代入される - didSetがない変数を渡すと参照が渡され代入される度に代入される
- differ
- initでの値設定ではdidSetが呼ばれないがdiffer内の変更は呼ばれる
SIL入門
- Swift Compailerの開発の中で得た学びを共有
- Swift Compailerの中のSILについて
- なぜSILなのか
- Swiftの型システムが学べる
- いろいろな最適化が行われている
- 楽しい
Clang モジュールの探検
- Cocoapodsの開発者の発表
- インポートとかモジュールマップに関する話
- Ccoapodsの苦労が垣間見える
レスポンダチェーンを知ろう
- ResponderChainについて
- sendActionを使っていろいろな依存関係をなくせる
- 詳しくは以下の情報を参照
関心の分離と単純化のためのSwiftコードの最適化
- コードは書かれることよりも読まれる事のほうが多い
- howからwhatを切り離す
関心の分離と単純化を行ったサンプルを紹介
- 1,2: extensionの例
- utf16.countが複数
- 例えば3ヶ月後にわからなくなる
- private extensionでurf16.countをどうして使っているのかの意図を明らかにする
- 3,4: Autolayoutの例
- 5: UITableViewの例
- 6: UserDefaultsの例
- 7: SafeAreaの例
- 8: Viewの例
- タップ領域を確保するViewクラスを用意した
- 9: UIStackViewの例
- 10: ViewControllerの例
コーダーがデザインすべきなのか
- デザインとはどう機能するか
- コンテキストの欠如を回避する必要がある
- デザイナは考えないエッジケースをエンジニアが見つける
- エンジニアとして技術的に何が可能化をチームメイトに理解させる手助けをすべき
- ユーザはデザインに習慣化していく(ios標準のアラートなど)
- 子供からは多くの質問が上がってくる、そのようは質問に全て応えられるようにすべき
- 子供の視点を大切にすべき。未来はそうなっているかもしれない。
- Appleの3例
- 録画時のシャッター音を消す
- Active Device
- Face ID
Event driven networking for Swift
- IOはそれほど発生しない
- Non Blocking IOのフレームワーク
- JVMなどで実装されているNettryが良い
- SwiftNIO == Netty for swift
- SwiftNIO == low level networking framework
- SwiftNIOはNettyのコピーではない
- 本日OSSとして公開 swift-nio
- Nettyrについてはこちらなど
変性のダイヤモンド
- Swiftの共変、反変の話
SwiftyPi
- RaspberryPiでSwiftを使う話
- Swiftがいろいろな環境で使えるようになってきた
- OSを選ぶ。 Raspbianかubuntuがおすすめ
- ラズパイをどう立ちあげるのか
- Swft4.1のARMv7対応はまだ
- Swift3.1.1をバイナリダウンロード
- Swiftからpinを指定するにはGPIO番号を使う
我が家を支えるSwiftの技術
使ってるサービスや技術
- slack
- Dokku
- Conoha VPS
- Vapor
- Fluent, PostgreSQL
- SlackKit
- Kanna, URLSession
- MongeKitten
- cron
- squid(自宅サーバ)
UI Test の楽しさとメリット
- Trelloのエンジニア
- コードのテストは簡単
- UIのテストは難しい
- たくさんのレベルがある。どこのテストを自動化するのか検討する。
- XCUITestを採用することにした
- 原因不明の失敗が20%発生するので導入はおすすめしない
- kickstarterはUnitTestでほとんどテストできているのでUIテストを行っていない
- 現状のTrelloのGOAL
- smokeテストの自動化
- MockAPI
- Snapshot testing
ブロックチェーンのクライアントをSwiftで実装する
- ethereumはAppstoreのようなもの
- objc or js で実装する
- block chainはクライアント開発に向いている
- web3.jsは、ReactNative or webKitを使う
Protocol Oriented WebAPI Abstraction
👾
- Swiftでゲーム開発する話
- Xcodeでゲーム開発環境は充実している
- SpriteKitを使って開発
- SpriteKitはSceneとNodeからなる。UIViewControllerとUIViewの関係のようなもの
- GameplayKitにゲーム開発のデザインパターンがまとまっている
- ステートマシン
- コンポーネント思考
- 多重継承のようなことを実現する
- ゲームでrx
- rxSpritekit
AST メタプログラミング
- Abstract syntax tree
- SourceKitが生成したASTを使ったライブラリがいくつもある
- ASTはSourceKitのものだけではない
- SourceKit, SwiftKitten
- swiftc -dump-parse, SwiftSyntax
- swiftc -emit-syntax
- swiftc -dump-ast
- SoureceKitはc++。SourceKittenはswiftのラッパー
- swiftc -dump-ast はすべての型情報が含まれている。ただパーサーはない。文字列出力のみ
- swiftc -emit-syntax jsonフォーマット
- SwiftSyntax ASTの生成から変更するAPIを提供している
- SwiftSyntax, swiftc -dum-pastはspecがまだ固まっていない
Aspect Oriented Programing in Swift
- レイアにまたがった処理の実装。ロギングなどに向いている
- Swiftのbuildphaseをインターセプトする方法は用意されていない
- コード生成して再ビルドする仕組みを作った
- 作ったもの