読者の皆様へ:お客様のご要望に応じて、重要なものを逃すことなく、ノイズを低減できる一連の機能を開発しました。興味のあるトピックを選択して、電子メールとWeb通知を入手してください。
Xcode 9.3で提供されているSwift 4.1では、Equatable
およびHashable
プロトコルの自動実装、条件付きの適合など、言語に対していくつか改善があった。
条件付き適合
条件付き適合によって、ジェネリック型がその型パラメータが特定の要件を満たす場合にのみ、プロトコルに準拠するという考え方を表現できるようになる。例えば、Array
は、その要素がEquatable
に準拠している場合にのみEquatableプロトコルを実装することができる。これは次の宣言にように表現できる。
extension Array: Equatable where Element: Equatable {
static func ==(lhs: Array<Element>, rhs: Array<Element>) -> Bool { ... }
}
これにより、Swiftジェネリックのギャップが埋まり、ジェネリックアダプタ型、つまり合成された型の機能をリフレクトするジェネリック型を使えるようになる。たとえば、Swift 3では、「lazy」な要素を扱う、LazySequence
、LazyCollection
、LazyBidirectionalCollection
、LazyRandomAccessCollection
の4つの異なるジェネリック型が存在する。これらのタイプのそれぞれは、合成された型として、同じAPIを再実装または転送する。条件付き適合を使用すると、lazy型のSequence
は、間に入るジェネリック型を定義せずにlazyプロトコルに準拠するものとして宣言することができる。
合成された==
とhashValue
Swift 4.1コンパイラは、Equatable
およびHashable
プロトコルへの準拠を宣言する構造体および列挙型に対して、==
およびhashValue
メソッドの実装を合成できる。以前は、開発者はこれらのメソッドのカスタム実装を提供する必要があったが、それは面倒な作業であった。つまり、メソッドの実装では、一般的な場合、構造体または共用体の対応するメンバをそれぞれ比較する必要があった。また、hashValueは、一意の文字列を返すことを保証する必要があった。Swift 4.1では、開発者はこれらのプロトコルへの準拠を宣言するだけで、関連するメソッドは自動的に合成される。ただし、すべての格納されたプロパティや列挙型がそれぞれEquatable
あるいはHashable
に準拠する必要がある。
Swift 4.1のその他の重要な変更点は次のとおりである。
-
ほとんどのライブラリコレクションに対してインデックス型は、
Hashable
に準拠しており、key-pathサブスクリプトとハッシュコレクションで使用できる。let s = "Hashable" let p = \String.[s.startIndex] s[keyPath: p] // "H"
-
Smart KeyPathsは完全に実装されている。 KeyPathsは現在、サブスクリプト、オプショナルチェーン、およびオプショナル強制的アンラップをサポートする。
- キーワード
weak
とunowned
プロトコルにおけるプロパティ宣言には使用できない。 - 既に存在するクラスに対する制限と同様に、Swift構造体は、別のモジュールで、構造体のフィールドを直接初期化するイニシャライザを定義することはできない。structフィールドにアクセスする前に、
self.init
を呼び出してstructを初期化しなければならない。
Swift 4.1内のすべての変更の完全なリストは、公式の変更ログにある。
Rate this Article
- Editor Review
- Chief Editor Action