2021/04/26にSwift5.4のリリースがあったのでその変更点をまとめました。
Swiftのアップデート一覧
- Support for multiple variadic parameters in functions, subscripts and initializers (SE-0284): 複数の可変長引のサポート
- Extend implicit member syntax (SE-0287): 暗黙のメンバー構文の拡張
- Result builders (SE-0289)
- Local functions supporting overloading: ローカル関数におけるオーバーロードのサポート
- Property wrappers for local variables: ローカル変数におけるプロパティラッパーのサポート
Support for multiple variadic parameters in functions, subscripts and initializers (SE-0284)
複数の可変長引数のサポート
今まで可変長引数は1つしか指定できなかったが複数指定できるようになった
func foo(_ a: Int..., b: Double...) { }
struct Bar {
subscript(a: Int..., b b: Int...) -> [Int] { a + b }
init(a: String..., b: Float...) { }
}
Extend implicit member syntax (SE-0287)
暗黙のメンバー構文の拡張
メンバーアクセスのチェーンをサポートし以下のように記述できるようになった。
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 (SE-0289)
新しい構造体を @resultBuilder
で定義することで、新しい結果ビルダーを定義することができる。定義するメソッドとプロパティは static
にする必要がある。
以下の結果ビルダーを使えば、その以下のように文字列を結合できる。
@resultBuilder
struct StringBuilder {
static func buildBlock(_ strings: String...) -> String {
strings.joined(separator: "\n")
}
}
値を定義する際には、buildBlock
メソッドを直接使用する必要があった。
そのため、各String
要素にはコンマを入れなければならなかった。
let stringBlock = StringBuilder.buildBlock(
"Tokyo",
"Kanagawa",
"Saitama",
"Chiba"
)
代わりに関数の中で@StringBuilder
を使えば、カンマを使わずに同じことができる。
@StringBuilder func makeSentence() -> String {
"Tokyo"
"Kanagawa"
"Saitama"
"Chiba"
}
Local functions supporting overloading
ローカル関数におけるオーバーロードのサポート
以下のように記述できるようになった。
func outer(x: Int, y: String) {
func doIt(_: Int) {}
func doIt(_: String) {}
doIt(x) // calls the first 'doIt(_:)' with an Int value
doIt(y) // calls the second 'doIt(_:)' with a String value
}
Property wrappers for local variables
ローカル変数におけるプロパティラッパーのサポート
以下のように記述できるようになった。
@propertyWrapper
struct Wrapper<T> {
var wrappedValue: T
}
func test() {
@Wrapper var value = 10
}