FRMSKI開発ブログ

AWS、iOS、AR/VRなど開発メモ

【Xcode 10.2 betaのSwift 5リリースノート】Swift言語のアップデート一覧

Swift Language

  • @dynamicCallable属性を使用すると、単純な構文を使用して関数を呼び出すのと同じ名前の型を呼び出すことができる。
@dynamicCallable struct ToyCallable {
    func dynamicallyCall(withArguments: [Int]) {}
    func dynamicallyCall(withKeywordArguments: KeyValuePairs<String, Int>) {}
}

let x = ToyCallable()

x(1, 2, 3)
// Desugars to `x.dynamicallyCall(withArguments: [1, 2, 3])`

x(label: 1, 2)
// Desugars to `x.dynamicallyCall(withKeywordArguments: ["label": 1, "": 2])`
  • キーパスが入力値全体を参照するWritableKeyPathをサポート。
let id = \Int.self
var x = 2
print(x[keyPath: id]) // Prints "2"
x[keyPath: id] = 3
print(x[keyPath: id]) // Prints "3"
  • Swift 5より前のバージョンでは、さまざまな引数を取る列挙型のケースを書くことができたが、代わりに、列挙型の場合を変更して配列を取得し、明示的に配列を渡す。
enum X {
    case foo(bar: [Int]) 
} 

func baz() -> X {
    return .foo(bar: [0, 1, 2, 3]) 
} 
  • Optional型の式を使用すると、ネストされたオプションを返すのではなく、結果のオプションがフラットになります。

  • UInt64(0xffff_ffff_ffff_ffff)のような式は、以前はデフォルトの整数リテラル型のIntをオーバーフローしていましたが、現在は有効です。

  • 文字列補間により、パフォーマンス、明瞭さ、および効率が向上しました。

  • Swift 4.2とSwift 5の間で#ifを使用してコードを条件付きにすることができます。次に例を示します。

#if compiler(<5)
extension MyType: _ExpressibleByStringInterpolation { /*...*/ }
#else
extension MyType: ExpressibleByStringInterpolation { /*...*/ }
#endif