Swift 4.1の新機能







この投稿は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安定化をリリースすることも同様に重要です。 待ってます、先生。








All Articles