Расширение словаря с помощью ключевых и ценностных ограничений
Я хочу расширить словарь и ограничить его конкретным типом ключа NSDate со значениями типа Array<MyClass>
MyClass - это быстрый класс без подкласса.
extension Dictionary where Key: NSDate, Value: Array<MyClass>{
func myFunction() -> Int{
// Some thing useful
}
}
Приведенный выше код возвращает ошибку сборки:
Тип "Значение" ограничен непротокольным типом "Массив"
Итак, кажется, что он должен быть ограничен конкретным протоколом, но как ни странно, когда я ограничиваю Value:
словарь расширения где Key: NSDate, значение: MyClass
Компилятор не жалуется и сборка завершается успешно. Но MyClass не является протоколом. Так что же дает?
Мне удалось ограничить это так:
extension Dictionary where Key: NSDate, Value: CollectionType, Value.Generator.Element: MyClass{
func myFunction() -> Int{
var count = 0
for (_, graphicItemArray) in self{
count+= (graphicItemArray as! [MyClass]).count
}
return count
}
}
Но это требует принудительного приведения, потому что мне нужно получить свойство count в форме I nteger.
Так почему я не могу явно ограничить его типом значения [MyClass]?
1 ответ
Не имея возможности использовать where
Предложение со структурой может быть ошибкой. Проверка ссылки на язык для положений и следование в
conformance-requirement → type-identifier | ...
Похоже, тип-идентификатор должен принимать struct
даже пример, который они используют Int
,
Это может быть что-то, чтобы подать ошибку.
В связи с вашей конкретной проблемой, кажется, работает, если вы используете _ArrayType
который является протоколом, который Array
реализует и имеет методы, которые вам нужны.
extension Dictionary where Key: NSDate, Value: _ArrayType ...
Я не уверен, что использование таких внутренних протоколов пометит ваше приложение и провалит его проверку Apple.