2015-01-14 2 views
1

В документации Swift говорится, что протоколы обрабатываются как любые другие типы, но, глядя на некоторые примеры, я вижу, что вместо протокола используется конструкция типа ограничения типа.Когда использовать Type Constraints в Swift?

Давайте возьмем Swift словарь для примера:

struct Dictionary<Key: Hashable, Value>: CollectionType, DictionaryLiteralConvertible { 
    // ... 
    subscript (key: Key) -> Value?  
    // ... 
} 

Может не то, что было написано, как этот

struct Dictionary<Value>: CollectionType, DictionaryLiteralConvertible { 
    // ... 
    subscript (key: Hashable) -> Value?  
    // ... 
} 

?

Я вижу вид ограничения, полезный с где условия для типов со связанными типами, но я не уверен в этом конкретном примере.

ответ

3

Если вы попытаетесь реализовать что-то вроде вашего второго примера, компилятор жалуется, что Protocol 'Hashable' can only be used as a generic constraint because it has Self or associated type requirements. Это связано с тем, что Hashable в конечном счете расширяет Equatable, что требует, чтобы как левая, так и правая сторона оператора равенства была точно такого же типа как друг друга. В вашем втором примере, однако, вы просто требуете, чтобы ключ словаря был Hashable, но не все ключи были одного и того же конкретного типа. Взгляните на this answer для более полного объяснения.

+1

Справа, справа: «В вашем втором примере вы просто требуете, чтобы ключ слова был Hashable, а не все ключи одного и того же конкретного типа». Благодаря! –