2016-05-25 2 views
3

Je semble être en train de courir dans ce qui semble être une incohérence du compilateur lors de la transmission d'arguments à une fonction générique qui a une restriction de protocole. Je peux passer un argument concret, mais pas un argument comme un type de protocolerestriction de protocole générique incohérente rapide

protocol Selectable { 
    func select() 
} 

protocol Log : Selectable { 
    func write() 
} 

class DefaultLog : Log { 
    func select() { 
     print("selecting") 
    } 
    func write() { 
     print("writing") 
    } 
} 

let concrete = DefaultLog() 
let proto: Log = DefaultLog() 

func myfunc<T: Selectable>(arg: T) { 
    arg.select() 
} 

myfunc(concrete) // <-- This works 
myfunc(proto)  // <-- This causes a compiler error 
proto.write()  // <-- This works fine 

Les rapports du compilateur:

error: cannot invoke 'myfunc' with an argument list of type '(Log)' 
myfunc(proto) 
^ 
note: expected an argument list of type '(T)' 
myfunc(proto) 
^ 

Si je restreins la fonction au protocole sélectionnable ou LOGGUE échoue encore.

Est-ce un bug du compilateur? Des pensées?

Répondre

1

Si vous utilisez un protocole, il n'a pas besoin d'être générique:

func myfunc(arg: Selectable) { 
    arg.select() 
} 

Je crois que T doit être un type concret pour les médicaments génériques.

+0

Ah très vrai, et cela m'a permis de contourner le problème. Oui, autant que je sache avec d'autres exemples, les types génériques doivent être concrets. Merci! –