iOS Programming: New updates in SWIFT 5.1

iOS Programming: New updates in SWIFT 5.1

1. 紹介

    a) リリース日

  • 2019年9月20日、 Appleは新しいXcode 11をリリースしました。これは新しいiOS 13の機能をサポートしています。 そしてそれに伴いAppleは開発言語として新しいバージョンのSwift5.1をリリースしました。

    b) 全体

  • Swift 5.1はSwift 5の拡張のmodule stability(section2)を利用することによりビルドが強化されています。
    Module stabilityはSwiftの将来のリリースのバイナリフレームワークの構築と共有を行うことができます。
    Swift 5.1はプログラム言語の許容量、プロパティのラッパーやopaque型のような標準的なライブラリの拡張が行われています。
    KeyPath Member Lookupの追加、適切なcollection型の比較、およびStringの型のための新しいAPIなどもそうです。
    全体としてSwift 5.1の新機能により、より良いAPIの設計が容易になり、一般的な定型コードの量が削減されます。

2. Module stability

  1. Swift 5.1では、module stabilityのための言語の追加サポートを利用し、他のユーザーと共有できるバイナリフレームワークを作成できます。
  2. Module stabilityはバイナリフレームワークのAPIを記述する新しいテキストベースのモジュールインターフェイスファイルを定義し、異なるバージョンのコンパイラを使用してプログラムをコンパイルできるようにします。

3. 標準ライブラリの更新

Swift5.1のstandard libraryはいくつかの下記の機能が含まれています。

  1. 異なっている配列の型を適切なものへハンドリングしてくれる
  2. 配列の初期化の柔軟性が増えた。
  3. 連続した文字列の作成や操作、UNICODEのサポート、String.indexとRangeの汎用的な初期化(generic initializers)が追加され簡単にStringを使えるようになります。
  4. SIMD(シングルインストラクション・マルチプルデータ)タイプを使用するための様々なインクリメンタルなAPIの改善。ベクターの拡張/削減、ベクターのswizzlingのサポートを含みます。
  5. ユニークな識別子のエンティティをサポートするための識別可能なプロトコルの提供。

4. 言語の改善

    a) 大きな変更点 自動生成 memberwise initializer

  1. Swift 5.1の大きな改善点としてSwiftで一般的に最も使われる機能であるmemberwise initializerがStructの標準になっているということです。
  2. 以前のSwiftのバージョン(Swift 5.0以前のバージョン)では, 値がデフォルトかそうでないかに関わらず、Struct内にすべてのパラメータを設定する必要がありました。memberwise initializerはStructのプロパティにマッチするするように自動的に作成されます。このような感じです。
  3. Swift 5.1では、memberwise initializerはすべてのプロパティにデフォルトのパラメータの値が設定されます。前述のサンプル画像ではscore のプロパティのデフォルトの値はです。これはパラメータを設定するか、デフォルトの値のままにするかということを指します。
  • これは重複コードを避けることができます。これはStructの初期化の柔軟性も与えてくれます。特に複数のインスタンスを同じプロパティのデフォルトから作りたい時です。良い点ではあるのですが、自動生成のたった一つのinitializer機能によるmemberwise initializerの宣言としてこれは明確ではありません。このような感じです。
  • 上記のような形では初期化は一つの機能ですが、2つの宣言が可能です。そのため、これはPublicなAPIのモジュールとして明確ではありません。これはライブラリやフレームワークを作る上で、Publicなinitializerを手動で宣言すべきということを意味しています。

    b) 単一式からの暗黙的な”return”

  • Swift 5.1では小さい削減があります。ただ言語構成として重要な違いです。単一式の関数ではreturnを削除することができ、暗黙的に処理の必要性を理解します。
  • 例えば:
  • Swift 5:
  • Swift 5.1では、もしfunctionが単一式または単一の値から判断されるステートメントであれば、returnを削除することができます。次のような形です。
  • これは最初困惑させるかもしれないが、じきに慣れると思います。

    c) Opaque型の”return”

  • Swift 5.1のopaque型の概念を紹介します。opaque型ではその型が何かを指定せずにオブジェクトに通知されます。
  • 全体的に、プロトコルのように聞こえますが、もしプロトコルがより機能するとopaque型の戻り値は概念を引き継ぐことになります。毎回同じタイプを内部で使用する必要があり、実装の詳細を隠すことができます。
  • 例として、もし異なる種類の動物のStructを作る時、下記のプログラムのようにします。
  • しかし、これらを比較するときに問題があります。おそらく2つのDogのインスタンスもしくは2つのCatのインスタンスを比較できますが、CatとDogのインスタンスを比較することができません。これはどちらの型で作ったのかを時々忘れるということを指しています。そのため下記のようにすることをお勧めします。

    d) 戻り値に含まれるSelf

  • 前回のSwiftバージョンではSelf キーワードが実際の具体的な型が不明なコンテキストで型を動的に参照できました。 たとえば、プロトコル拡張内のプロトコルの実装タイプを参照する場合。
  • Swfit5.1のSelfのスコープはenum、 struct、classのような具体的な型も含まれるようになりました。これによりSelfはメソッドまたプロパティを含んだ型のためのaliasの一種として使用できます。下記のような形です。
  •  
  • 完全なTextTransform型名ではなく、上記のSelfを使用できるようになったという事実は、もちろん純粋にsyntactic sugar(糖衣構文)です。しかし、それはプログラムを短くしてくれるのに役立ちます。長い名前のものを処理する場合は特にです。メソッドまたはプロパティ内でSelf Inlineを使用して、上記のコードをさらにコンパクトにすることもできます。
  • さらに例を見てみましょう。
  • 最初の例では、StatisticなプロパティpoolConnectionsとして表示されます。クラス内でプロパティをオーバーライドされた後でさえThrottleNetworkManager、それは親クラスの値として出力されるでしょう。そして2つ目の画像のようにSelf は問題の解決を行うことができます。これはプロトコルなどの拡張クラスを柔軟に用いることができます。

    e) 曖昧なnoneケースの警告

  • Swiftのオプショナルは2つのenumが値の存在があるものと”none”の状態で設定されるとします。もし作成したオプショナルを含んだenumの値がない場合、これは混乱を招く恐れがあります。
  • optionalColorの値は“nil” です。なぜならSwiftは.noneをoptionalがemptyと推測します。”CustomColor.none”ではなく。
  • Swift 5.1この混乱に対して警告を表示します。“Assuming you mean ‘Optional.none’; did you mean ‘CustomColor.none’ instead?” これは互換性がないエラーを避けるためです。しかし、少なくともプログラムが開発者が思っていることと異なっているということを開発者に知らせています。

    f) オプションの列挙と非オプションの照合

  • SwiftはStringとIntegerのためにoptionalと非optionalの間でswitch/caseの照合のハンドルをいつも適切に行ってます。しかし、Swift5.1の前はenumは拡張されていませんでした。
  • Swift 5.1ではoptionalと非optionalのswitch/caseでの照合は次のように行うことができます。

    g) Ordered collection diffing

  • Swift 5.1は2つのオーダのcollectionで異なる計算の新しいメソッドを提供しています。これはどの要素を削除するか、どの要素を追加するかも含みます。これは同じ要素のcollectionの順序付けされたものに使用することができる。
  • このデモンストレーションのために、複数のscoreの配列を作成します。一方から他方への差を計算し、それらの差をループし、それぞれを適用して2つのcollectionを同じにすることができます。
  • 一部の人は配列を同じものに変更することは単純に他のものにいれるだけだということでとても簡単だと思うかもしれません。しかし、UIの更新として悪いパフォーマンスの原因になるかもそれません。例えば、datasource Listのtableview Tがあります。 Datasource Listはweb API/ web サービスから読み込まれています。APIからのデータ変わったとき、Listは変更され、tableView Tも変更されるでしょう。そしてもし全体の新しいサービスからのdatasetが適用されると、tableviewは完全にリロードされます。そしてUIパフォーマンス上いくつかのタイムラグが発生します。Diff APIでは、簡単に削除や新しい行の追加を行うことができます。これはUIを変更する際の時間短縮に役立てることができます。

5. 結論

  • Swift 5.1は開発中です。しかし、Swift自身の最終のブランチは過ぎましたが、その他の関連したプロジェクトのためのいくつかのスコープがあります。
  • Swiftは現在ABI stableだけではなく、module stableでもあります。さらに、Swift 5.1ではほとんどすべてのCodebaseに適用できます。小さいながらも歓迎すべき多くの変更と調整が含まれています。
  • codebaseの柔軟性のような良い点のほかに、考慮すべき機能がいくつかあります。 オプションの列挙(セッション4.e、4.f)はバグとしてマークされ、将来の外部のバグを回避するために、代わりに明示的な型を使用することを開発者に知らせてくれます。

あなたはどう思いますか? もうすでにあなたのプロジェクトはSwift5.1に移行しましたか?
もしまだであれば、ぜひ試してみてください!!

 

引用:

  1. https://swift.org/blog/swift-5-1-released/
  2. https://www.hackingwithswift.com/articles/182/whats-new-in-swift-5-1