Почему [Int] не соответствует Hashable в Swift 4.1? - PullRequest
0 голосов
/ 29 апреля 2018

В Swift 4.1 (Xcode 9.3) я пытаюсь создать Набор [Int], но получаю:

Тип '[Int]' не соответствует протоколу 'Hashable'

Но, насколько я могу судить, https://swift.org/blog/conditional-conformance/ говорит, что Array теперь соответствует Hashable, когда его значения соответствуют Hashable. В качестве обходного пути у меня есть:

extension Array: Hashable where Element == Int {
    public var hashValue: Int {
        return debugDescription.hashValue
    }
}

Но мне все еще интересно, почему я не получаю Hashable бесплатно.

1 Ответ

0 голосов
/ 29 апреля 2018

Автоматический синтез 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...