WWDC What's New In Swift まとめ
早速elmのほうがネタ切れになってきました…やると分かるんですが、 一線を超えると本当に簡単な言語 であまり紹介するTipsがないんですよね。
組み方もいわゆるReduxが強制されますし、Middlewareもフレームワーク内蔵の方法で完結するので、組み方の選択肢があまりないというのも一因です。
ですのでちょっと趣向を変えてネイティブアプリの紹介をしていきたいと思います。
当面のテーマは iOS
WWDCの気になるセッションの概要を書いていきたいと思います。
第一回目は Session 402 What’s New In Swift
ちなみに個人的にですけど、去年/おととしが SWIFT! SWIFT!! SWIFT!!! という印象に対し、今年は AR! ML! Drag&Drop! Drag&Drop!! という印象でした。
Swiftの言語仕様が安定してきた証拠ですね。ではさっそくいきましょう。
What’s New in Swift
概要
SwiftはOpenSourceで進化しつづける。
Xcode9でリファクタリングサポート
改善したSwiftPackageManager
- ServerSide用
- ManifestAPI
- Xcodeframeworkとして出力可能
目次
- 言語機能の改善
- ソース互換性
- ツールとパフォーマンス
- 標準ライブラリ
- 排他的メモリアクセス
言語機能の改善
privateアクセス修飾子
- 同一ファイル内の Extension から private が見えるよう改善
- Swift3では fileprivate にする必要があり、範囲が広すぎた
複合的なジェネリクスのサポート
protocol Shakable {} extension UIButton : Shakable extension UILabel: Shakable //&& func shake(controls : [UIControl && Shakable]) { }
KeyPathのアクセス改善
let namKeyPath = \User.name
でキーパス取得可能user[keyPath : nameKeyPath]
で値の取得可能
Codable によるArchive処理の改善
ソースコード互換性
Swift4
- だいたいSwift3と互換性がある
Swift3.2
利用ターゲット(ライブラリ)ごとにSwift3.2/Swift4が選択可能
ビルドの改善
より速いビルドシステムの採用
- ProjectSettingsから変更できる
- 執筆時点でPreview版なので要注意
長時間続くIndexingの改善
- より高精度な結果 (Index後の補完のこと?)
Structのパフォーマンス改善
- Swift3のパフォーマンスは予測不能
- struct の変数が3つを超えた瞬間に処理時間が跳ね上がる
- 3つ以上だとヒープ領域が走るため
- Swift4ではCopyOnWriteを採用しヒープ確保頻度を下げた
ジェネリクス利用コードの速度改善
より小さいバイナリサイズ
- 使っていないExtensionをビルド時に消すようにした
使ってない @objc の削除
- Swift3ではObjC関与するメソッドに
@objc
属性を追加してた - しかし実際不要な場所にも追加していた
- これを改善。必要な場所にのみ付与するように
- ビルドで警告が出る場所には手動で追加するようになった
- Swift3ではObjC関与するメソッドに
シンボルサイズの削減
- BuildSettingsの
Strip Swift Symbols
- デフォルトは enabled
- BuildSettingsの
Swift Strings
ChracaterではUnicodeCorrectnessが標準
- どう訳すべきか…
- 絵文字など、表示上一文字なら string.count も 1 になる
絵文字/ラテン語/かな等の処理速度改善
範囲指定アクセスの改善
- Swift3
str[str.startIndex..<str.endIndex]
- Swift4
str[str.startIndex...]
- 配列等とslice指定が可能になった
- Swift3
StringをCollection同等として扱えるようになった
str.contains {$0.condition}
str.filter {$0.condition}
substringのメモリ効率改善API追加
- 巨大な文字列のsubstringを保持した場合、「元の巨大な文字列バッファの参照が残り続ける
- Substring型、String(_: Substring) を追加し、コピーできるよう修正
- これを使えば元の巨大な文字列は破棄できメモリ節約になる
複数行文字列のサポート
- よくあるダブルクオート3つ
let joke = """ Q: Why does \(name) have \(n) \(character)'s in their name? A: I don't know, why does \(name) have \(n) \(character)'s in their name? Q: Because otherwise they'd be called \(punchline). """
- 新しいジェネリクスの機能
- associatedtype で where 指定が可能に
protocol Sequence { associatedtype Iterator : IteratorProtocol //Subsequenceが同一Element種別と指定可能になった associatedtype SubSequence : Sequence where SubSequence.Iterator.Element == Iterator.Element }
- subscript のジェネリクスサポート
- 補足 :
[]
でアクセスするやつのことです
- 補足 :
extension JSON { subscript<T: JSONConvertible>(key: String) -> T? { /// } } let str : String = json["name"]
排他的メモリ制御
※資料見た範囲ではうまく把握しきれず。(※対応するSE-0173はSwap特化でやや違う気がする) * Collectionの走査中に、Collectionの変更に対する処理が制限された? * Javaのforeach中にCollection走査でエラーになるのと同じようなイメージ?