2016-12-09 2 views
3

Это изолированный пример, поэтому может показаться менее полезным, но мне все равно интересно, почему это не работает? Любое понимание очень ценится.Swift Generics (тип substitution?)

protocol Prot: class { 
    init() 
} 

class A: Prot { 
    required init(){ } 
} 

struct Client<T: Prot> { 
    let tau: T.Type 
} 

if let aTau = A.self as? Prot.Type { 
    print(aTau === A.self) // ✅ 
    Client(tau: A.self)  // ✅ 
    Client(tau: aTau)  // ❌ 
} 

Ошибка:

Cannot invoke initializer for type 'Client<_>' with an argument list of type '(tau: Prot.Type)' 
+2

Это вариант [Протокол не соответствует самому себе?] (Http://stackoverflow.com/questions/33112559/protocol-doesnt-conform-to-itself) - вы не можете использовать 'Prot' как тип, который соответствует 'Prot'. – Hamish

ответ

2

Родовое Client класс нужен конкретный тип для специализации - то есть класс/структура/перечислений, и Prot.Type не соответствует этому требованию. Вот почему вы получаете ошибку.