Расширение словаря с помощью ключевых и ценностных ограничений

Я хочу расширить словарь и ограничить его конкретным типом ключа 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.

Другие вопросы по тегам