Swift 4.1の新機能


この投稿はPaul HudsonによるSwift 4.1の新機能の無料翻訳です


Swift 4.1は、Swift 4の最初のマイナーリリースであり、EquatableおよびHashableの自動使用、条件一致など、いくつかの便利な機能をもたらしました。


少なくともXcode 9.3インストールしてから、新しいプレイグラウンドを作成してください。 このバージョンの新機能を見てみましょう...


赤道化可能およびハッシュ可能


Equatableでは、あるエンティティを別のエンティティと比較できEquatable5 == 5と言うと、SwiftはIntEquatableプロトコルに準拠しているため、これが何を意味するかを理解し、したがって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サポートもHashablehashValueは、このプロトコルに準拠するように自動的に生成できるようになりました。 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では静かにコンパイルされますが、 PersonCodableプロトコルに準拠していないため、実行時にエラーが発生します。 Swift 4.1はこの問題を解決します: OptionalArrayDictionaryおよび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安定化をリリースすることも同様に重要です。 待ってます、先生。



Source: https://habr.com/ru/post/J352514/


All Articles