Dev日記

プログラミング学習のまとめなど

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

Session402より

概要

  • 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処理の改善

    • JSONパースにも使える
    • インパクト大きく、ググれば色々出てますので詳細は省略

ソースコード互換性

  • Swift4

    • だいたいSwift3と互換性がある
  • Swift3.2

  • 利用ターゲット(ライブラリ)ごとにSwift3.2/Swift4が選択可能

ビルドの改善

  • より速いビルドシステムの採用

    • ProjectSettingsから変更できる
    • 執筆時点でPreview版なので要注意
  • 長時間続くIndexingの改善

    • より高精度な結果 (Index後の補完のこと?)
  • Structのパフォーマンス改善

    • Swift3のパフォーマンスは予測不能
    • struct の変数が3つを超えた瞬間に処理時間が跳ね上がる
      • 3つ以上だとヒープ領域が走るため
    • Swift4ではCopyOnWriteを採用しヒープ確保頻度を下げた
  • ジェネリクス利用コードの速度改善

  • より小さいバイナリサイズ

    • 使っていないExtensionをビルド時に消すようにした
  • 使ってない @objc の削除

    • Swift3ではObjC関与するメソッドに @objc 属性を追加してた
    • しかし実際不要な場所にも追加していた
    • これを改善。必要な場所にのみ付与するように
    • ビルドで警告が出る場所には手動で追加するようになった
  • シンボルサイズの削減

    • BuildSettingsの Strip Swift Symbols
    • デフォルトは enabled

Swift Strings

  • ChracaterではUnicodeCorrectnessが標準

    • どう訳すべきか…
    • 絵文字など、表示上一文字なら string.count も 1 になる
  • 絵文字/ラテン語/かな等の処理速度改善

  • 範囲指定アクセスの改善

    • Swift3 str[str.startIndex..<str.endIndex]
    • Swift4 str[str.startIndex...]
      • 配列等とslice指定が可能になった
  • 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).
    """
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走査でエラーになるのと同じようなイメージ?