Автоматический синтез Hashable
для массивов Hashable
элементов
реализован в Swift 4.2. Автоматический синтез Equatable
для массивов Equatable
элементов реализован в Swift 4.1.
Это кажется вводящим в заблуждение в указанной записи в блоге, но
четко указан в Swift CHANGELOG :
Swift 4,2
Стандартные типы библиотек Optional
, Array
, ArraySlice
,
ContiguousArray
, Dictionary
, DictionaryLiteral
, Range
и ClosedRange
теперь соответствуют протоколу Hashable
, когда их элементы или связанные типы
(в зависимости от обстоятельств) соответствует Hashable
. Это делает синтезированный
Hashable
реализации доступны для типов, которые включают в себя хранимые
свойства этих типов.
Swift 4.1
Стандартные типы библиотек Optional
, Array
, ArraySlice
,
ContiguousArray
и Dictionary
теперь соответствуют протоколу Equatable
когда их типы элементов соответствуют Equatable
. Это позволяет ==
оператор для создания (например, можно сравнить два значения типа [Int : [Int?]?]
с ==
), а также использовать различные алгоритмы, определенные для
Совместимые типы элементов, такие как index(of:)
.
Это также обсуждается в
Пусть Optional, Dictionary и Array условно соответствуют Hashable
в форуме Swift:
При синтезировании Hashable я заметил, что Array, Optional и Dictionary не соответствуют условно Hashable, а Set (безусловно) -.
Обратите внимание, однако, что способность определять условное соответствие
протокол * доступен в Swift 4.1 , так что вы можете обобщить
ваше расширение до
#if swift(>=4.2)
#else
extension Array: Hashable where Element: Hashable {
public var hashValue: Int {
// ... whatever ...
}
}
#endif