能登 要

札幌在住のiOSアプリ開発者。SwiftUI により分割されたデバイス間を縦横にやりとりできる考え方に転換しています。

iOSアプリ開発者。2009年のiPhoneアプリ開発開始時期から活動。開発言語のアップデートの中でSwiftUIおよび周辺技術に着目中。

[プレゼン資料] 整理されたSwift言語仕様 - Swift 5.7 any/some

2022年6月25日に行われた札幌iPhone開発勉強会でのプレゼンテーション資料。

WWDC22で発表されたプログラミング言語Swift5.7(正式リリースは22年秋)についてのプレゼンテーション資料。

1) 概要

新しく追加されたanyというキーワードに説明するためには対となるsomeについて説明しなくてはならない、しかしsomeはWWDC19(2019年)に発表されたのになぜ3年のずれが起きたのか、なぜsome/anyが必要となったのかを説明するためには2019年からの経緯と、Appleが解決したい問題について話す必要があった。

anyは、これまでSwiftに存在していたSwift genericsのwhere節 の記述をanyでわかりやすく記述できるというものであるがAppleプラットフォーム開発者がSwift言語のトレンドを毎年追いかけているわけでもないため数年かけて言語仕様が整理された際にキャッチアップが難しくなると感じた(プレゼンテーションも自分の中で理解度を高めたい狙いがあった)。

2) プレゼンテーション作成時に気になった事

新しく追加されたキーワードanyはSwift5.6以前の記述を整理する形で追加、Swift5.6の記述も温存されている。

以下にSwift5.7から導入される記述方法とSwift5.6以前の記述方法で記述したfooFunc() を定義する。

protocol FooProtocol {

}

struct ImplementFoo: FooProtocol{

}

func fooFunc<T: FooProtocol>(_ object: T) {

}

func fooFunc(_ object: any FooProtocol) {

}

2つのfooFunc() が存在しており役割も概ね同じ。では以下の呼出ではどちらが呼び出されるだろか?

fooFunc( ImplementFoo() )

2022年6月時点ではanyを使ったものが呼び出される。これはSwiftの内部で何かしらの優先度が決まっているのかもしれない(普通に使う分には特に気になる仕様ではない)。

参考