Просто посоветуйтесь с сообществом, прежде чем я подам радар:
В файле .h Obj-C:
@protocol myProto <NSObject>
@end
В файле .swift (который имеет доступ к приведенному выше определению протокола через заголовок моста):
class myClass {
// This line compiles fine
var dictOne: [NSObject:Int]?
// This line fails with "Type 'myProto' does not conform to protocol 'Hashable'"
var dictTwo: [myProto:Int]?
}
Проверка класса NSObject показывает, что он (или NSObjectProtocol, которому он сопоставляется) не реализует метод hashValue, требуемый протоколом Hashable, и не принимает его явно.
Итак, где-то за кулисами NSObject, несмотря на это, помечается как Hashable, но не распространяется на протоколы, которые принимают NSObject / NSObjectProtocol.
Есть ли у меня ошибка или я что-то упускаю?
:) Тео
Дополнительная информация:
документация предполагает, что:
- Единственное требование к ключевому типу словаря - это то, что он Hashable и реализует
==
. - Вы действительно можете использовать протокол.
Hash Values for Dictionary Key TypesТип должен быть хешируемым, чтобы его можно было использовать в качестве ключевого типа словаря, то есть тип должен обеспечивать способ вычисления хеш-значения для себя. Хеш-значение - это значение типа Int, которое одинаково для всех сравниваемых объектов, так что если a == b, следует, что a.hashValue == b.hashValue.
Все основные типы Swift (такие как String, Int, Double и Bool) по умолчанию хешируются, и все эти типы могут использоваться в качестве ключей словаря. Значения членов перечисления без связанных значений (как описано в разделе «Перечисления») также по умолчанию хешируются.
ПРИМЕЧАНИЕ. Вы можете использовать свои собственные пользовательские типы в качестве типов ключей словаря, сделав их соответствующими протоколу Hashable из стандартной библиотеки Swift. Типы, соответствующие протоколу Hashable, должны предоставлять свойство gettable Int с именем hashValue, а также должны обеспечивать реализацию оператора «равно» (==). Значение, возвращаемое свойством типа hashValue, не обязательно должно быть одинаковым при разных выполнениях одной и той же программы или в разных программах. Для получения дополнительной информации о соответствии протоколам см. Протоколы.