言語と標準ライブラリ
Swift 5.7では、言語と標準ライブラリに多くの改良が施されています。
-
if let
構文や複数のクロージャ構文における型アノテーションなど、一般的な定型文で利用できる新しい省略記法。 - 言語仕様上の制限を解除することによって、ジェネリックプログラミングの親和性を改善。
- 新しいアノテーションとオプトイン診断により、データ競合の安全性が強化されました。
- 分散環境におけるアクター分離。
- 既存のポインタAPI群の使い勝手を改善。
- 文字列処理のための全く新しい言語サポートとAPI。
ジェネリクスの改善された実装
ジェネリクスを扱いやすくする言語仕様の改良に加えて、型検査のジェネリクス実装が完全に書き直され、正確さとパフォーマンスが改善されました。
新しい実装では、多くのバグが修正されました。
コレクションのSubSequence
関連型に対する同一型要件のような複雑な同一型要件の処理と、Self.Element == Self
という要件を定義するCaseIterable
プロトコルを使用したコードに関連するものです。
ジェネリクスの新しい実装によって、パフォーマンスも向上しました。
プロトコルと関連型の特定の構成で、型検査の時間はSwift 5.6では指数関数的なスケールしていましたが、Swift 5.7では線形になりました。
自動参照カウントの改善
Swift 5.7では、最適化が許可されているときに変数の寿命を短くするための新しいルールを指定することによって、ARCの動作はより予測可能で、ユーザーフレンドリーで、パフォーマンスも良くなっています。
ルールを強制するために、コンパイラは「各変数の語彙的スコープ」を追跡する新しい内部表現を採用しました。
これには、既存の最適化の更新に加えて、いくつかの最適化を新たに実装する必要がありました。
拡張された変数寿命に依存する最も一般的なプログラミングパターンが、プログラマが明示的に withExtendedLifetime()
を使用しなくても安全に実行できるようになりました。
これにより、最適化されたビルドでは実行時に発生する「診断が困難なライフタイムバグ」から保護されます。
また、既存のソースを壊すことなく、より強力な最適化を導入することも可能です。
コード補完
関数呼び出しの引数、変数、およびグローバル関数のコード補完が、Swiftの型チェッカーに緊密に統合されました。
これにより、コード補完は曖昧なコードやエラーのあるコード内部でより正確な結果を提供できます。
以下は、 +
の後を補完する場合の例です。
コード補完は、周囲のコンテキストに一致するものとして int
と string
を提案します。
エディタは、これらの提案結果を array
よりも上位にランク付けすることができるようになりました。
func makeIntOrString() -> Int {}
func makeIntOrString() -> String {}
let array = [4, 2]
let int = 42
let string = "Hello World!"
makeIntOrString() +
次の例は、欠けている引数を補完する場合です。
最初の引数は「整数の 1
」なので、コード補完は secondInt
引数ラベルのみを提案します。
secondString
は省略されるようになりました。
func add(_ firstInt: Int, secondInt: Int) {}
func add(_ firstString: String, secondString: String) {}
add(1, )