この投稿はPaul HudsonによるSwift 4.1の新機能の無料翻訳です
Swift 4.1は、Swift 4の最初のマイナーリリースであり、EquatableおよびHashableの自動使用、条件一致など、いくつかの便利な機能をもたらしました。
少なくともXcode 9.3をインストールしてから、新しいプレイグラウンドを作成してください。 このバージョンの新機能を見てみましょう...
赤道化可能およびハッシュ可能
Equatable
では、あるエンティティを別のエンティティと比較でき
Equatable
。
5 == 5
と言うと、Swiftは
Int
が
Equatable
プロトコルに準拠しているため、これが何を意味するかを理解し、したがって
Int
型のエンティティに対して「
==
」が意味することを説明する関数を実装します。
独自の型(構造、列挙)でEquatable
を実装すると、文字列、配列、数値などと同様にそれらを操作できます。 また、値で渡される型の一般的な概念によりよく一致させるために、構造がEquatable
プロトコルに準拠している場合に適しています。
ただし、 Equatable
の実装はエレガントすぎないかもしれません。 たとえば、次のような構造があります。
struct Person { var firstName: String var middleName: String var age: Int var city: String }
また、 Person
タイプの2つのエンティティがあり、それらを比較する場合は、次のように4つのプロパティすべてを比較する必要があります。
struct Person: Equatable { var firstName: String var lastName: String var age: Int var city: String static func ==(lhs: Person, rhs: Person) -> Bool { return lhs.firstName == rhs.firstName && lhs.lastName == rhs.lastName && lhs.age == rhs.age && lhs.city == rhs.city } }
読むことすら難しく、 書く ことは難しい。
幸いなことに、Swift 4.1では、 Equatable
自動一致Equatable
です。 ==
メソッドは自動的に生成され、上記のように最初のエンティティのすべてのプロパティを2番目のエンティティのすべてのプロパティと比較します。 あなたがしなければならないのは、あなたのタイプにEquatable
を追加することです、そして、Swiftは残りをします。
当然、独自のバージョンの==
メソッドを実装できます。 たとえば、タイプにエンティティを一意に識別するid
プロパティがある場合、Swiftに追加の作業を行わせる代わりに、 ==
と記述してこのプロパティのみを比較できます。
Equatable
と同様に、Swift 4.1 Hashable
サポートもHashable
。 hashValue
は、このプロトコルに準拠するように自動的に生成できるようになりました。 Hashable
通常、迷惑です。エンティティごとに一意の(多かれ少なかれ一意の)ハッシュを返す必要があるためです。 これは、エンティティを辞書のキーとして使用したり、エンティティをセットに保存したりできるため、重要です。
以前は、次のようなものを書く必要がありました。
var hashValue: Int { return firstName.hashValue ^ lastName.hashValue &* 16777619 }
これにより、Swift 4.1でhashValue
実装を記述する必要はほとんどありませんが、それでも必要な場合は実行できます( Equatable
==
とEquatable
)。
注:必要に応じてこれらのプロトコルをタイプに追加し、タイプのすべてのフィールドもそれらに対応する必要があることを忘れないでください。
詳細については、 Swift Evolutionの提案SE-0185を参照してください 。
条件付きコンプライアンス
Swift Evolutionの提案SE-0143は条件付き一致を提案し、現在はSwift 4.1にあります。 これは多くの人に役立つ強力な機能です。 今まで働いていなかったものが彼女と一緒に働くようになります。 たとえば、Swift 4.0では、このようなコードはコンパイルされません。
var left: [String?] = ["Andrew", "Lizzie", "Sophie"] var right: [String?] = ["Charlotte", "Paul", "John"] left == right
これは、 String
と[String]
がEquatable
に対応しているが、 [String?]
Equatable
対応してEquatable
ないためです。 条件付き一致とは、特定の条件が満たされている限り、タイプがプロトコルに準拠することを意味します。 これは、配列の要素がEquatable
に対応するEquatable
、配列全体がEquatable
対応することをEquatable
ます。
条件付き一致はCodable
プロトコルにまで拡張され、これによりいくつかの安全性がCodable
ます。 このコードを見てください:
struct Person { var name = "Taylor" } var people = [Person()] var encoder = JSONEncoder() try encoder.encode(people)
Person
型の1つの要素の配列があり、この配列をJSONに変換しようとしています。 このようなコードはSwift 4.0では静かにコンパイルされますが、 Person
がCodable
プロトコルに準拠していないため、実行時にエラーが発生します。 Swift 4.1はこの問題を解決します: Optional
、 Array
、 Dictionary
およびSet
は、コンテンツがこのプロトコルに準拠している場合にのみCodable
プロトコルに準拠するようになり、Swift 4.1ではこのようなコードは単にコンパイルされません。
条件付きマッチングは、多くのコードを書かなくても、ほとんどの人にとって生活を楽にする機能の1つです。
flatMapは(ほぼ)compactMapになりました
flatMap()
はSwift 4.0の多くの機能に役立ちますが、その主な機能はエンティティをコレクションに変換し、同時に結果からnilを削除することです。
Swift Evolutionの提案SE-0187はこれを変更することを提案し、Swift 4.1 flatMap()
その意味をより明確に伝えるためにflatMap()
名前flatMap()
変更されcompactMap()
。
例:
let array = ["1", "2", "Fish"] let numbers = array.compactMap { Int($0) }
これにより、 Int
型に変換すると「Fish」がnil
を返し無視されるため、 Int
型の要素を持つ配列が作成されます。この配列には1と2の数値が含まれます。
Swift 5.0を楽しみにして
条件付きコンプライアンスの実装は安定性に貢献し、 Equatable
およびHashable
自動サポートは開発者の生活を間違いなく簡素化します。
SE-0192:非網羅的な列挙型 、 SE-0194:列挙型ケースの派生コレクション 、 SE-0195:動的メンバー検索など、他のオファーが現在レビュー中または開発中です。
今年、AppleがSwiftのABI安定化をリリースすることも同様に重要です。 待ってます、先生。