先日リリースされたSwift 5.4では、複数の可変数引数のサポート、暗黙的メンバ構文の拡張、ローカル関数オーバーロードのサポート追加などが行われている。実行時のパフォーマンスやバイナリサイズも改善された。
バージョン5.3までのSwiftでは、可変数引数はパラメータリストについてひとつに限られていた。例えば、可変数引数と、それに続く非可変引数を持つSwift関数は、次のように定義される。
func variadicFunction(_ args: String..., additionalArg: String) {
for arg in args {
...
}
}
Swift 5.4では、それぞれの先頭にラベルを定義することで、可変数引数の複数定義が可能になった。
func variadicFunction(_ args: String..., moreArgs: String...) {
...
}
Swift 5.4では、いわゆる"先行ドット構文(leading dot syntax)"も拡張されており、メンバ参照のチェーンが可能になった。先行ドット構文では、以下のスニペットにあるように、コンテキストから推測可能な型情報を省略できる。
view.backgroundColor = .systemBackground
//-- same as view.backgroundColor = UIColor.systemBackground
これまで、この構文が可能なのは静的メンバに限られていたが、今回のリリースで、非静的メンバを含む複数のメンバアクセスをチェーンできるようになった。
let milky: UIColor = .white.withAlphaComponent(0.5)
let milky2: UIColor = .init(named: "white")!.withAlphaComponent(0.5)
let milkyChance: UIColor?= .init(named: "white")?.withAlphaComponent(0.5)
もうひとつの新機能であるリザルトビルダ(result builders)は、コンポーネントのシーケンスから戻り値を暗黙的に構築する関数の定義を可能にするものだ。例えば次の定義は、
@TupleBuilder
func build() -> (Int, Int, Int) {
1
2
3
}
以下のように解釈される。
func build() -> (Int, Int, Int) {
let _a = TupleBuilder.buildExpression(1)
let _b = TupleBuilder.buildExpression(2)
let _c = TupleBuilder.buildExpression(3)
return TupleBuilder.buildBlock(_a, _b, _c)
}
Appleによると、
このプロポーザルは、関数のステートメントにビルダ変換(builder transformation)を適用することによって、ドメイン固有言語に組み込まれた新たなクラスをSwiftで開発できるようにするものです。
リザルトビルダがSwift UIで使用されていることは周知の事実だが、Shortcut DSLやCSS DSLなど、さまざまなDSLの構築にも使用されている。
Swift 5.4で可能になった新たな構文機能として最後に挙げるのは、ローカル関数のオーバーロードだ。これにより、パラメータのみが異なる複数の組み込み関数を定義することが可能になる。
func aGlobalFunction() {
func localFunc(arg: Int) { ... }
func localFunc(arg: String) { ... }
func localFunc(arg: Float) { ... }
...
}
Swift 5.4で実現した歓迎すべき改善のひとつは、実行時のプロトコル適合性チェックに関するパフォーマンスの向上である。これによってas?
やas!
を使ったキャストが大幅に高速化される他、String
補間やretain
/release
コールの効率も向上する。
Swift 5.4にはここに挙げた他にも、Swing Package Managerの多数の新機能、Windowsサポートの強化、開発者エクスペリエンスの向上など、数多くの改善が含まれている。詳細は公式発表を参照して頂きたい。
Swift 5.4はXcode 12.5に含まれており、Mac App Storeから入手可能である。