consideri il seguente:Swift estensione protocollo di esecuzione con un altro protocollo comune tipo associato
protocol Foo {
typealias A
func hello() -> A
}
protocol FooBar: Foo {
func hi() -> A
}
extension FooBar {
func hello() -> A {
return hi()
}
}
class FooBarClass: FooBar {
typealias A = String
func hi() -> String {
return "hello world"
}
}
Questo codice compila. Ma se commento la definizione esplicita del tipo associato typealias A = String
, allora per qualche ragione, swiftc non riesce a dedurre il tipo.
che sto sentendo questo ha a che fare con due protocolli che condividono lo stesso tipo di associato ma senza un'affermazione diretta attraverso, ad esempio, il tipo di parametrizzazione (tipo forse associato non è potente/abbastanza maturo?), Che lo rende ambiguo per l'inferenza di tipo.
Non sono sicuro che si tratti di un bug/immaturità della lingua, o forse, mi mancano alcune sfumature nell'estensione del protocollo che giustamente portano a questo comportamento.
Qualcuno può far luce su questo?
quando dici rapido non riesce a dedurre il tipo, qual è l'errore del compilatore e su quale linea? –
@PatrickGoley Swift non riesce a vedere 'hello()' e 'hi()' 'restituisce il tipo 'A' per essere di tipo equivalente e, quindi, mi impone di implementare anche il metodo' hello() '. Dice 'FooBarClass' non riesce a conformarsi al protocollo' FooBar' –
Penso che questo dovrebbe essere considerato come un bug. La soluzione che ho trovato sta dichiarando 'typealias' nel protocollo' FooBar'. cioè: 'protocollo FooBar: Foo {typealias A; func hi() -> A} ' – rintaro