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?
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! –