Oto przykład zabaw:Jak wywołać bardziej konkretny sposób przeciążenia
protocol P {
associatedtype T
func getValue() -> T
}
class Foo: P {
func getValue() -> String {
return "hello"
}
}
class Bar {
func test<T: P>(_ o: T) {
print("Generic", o.getValue())
}
func test(_ o: Any) {
print("Any")
}
}
let foo = Foo()
let bar = Bar()
bar.test(foo)
This wyjścia: Any
.
Po usunięciu dowolnej wersji test
zostanie wywołana metoda ogólna. Klasa Foo
jest zgodna z protokołem P
, dlaczego Swift nie wybiera metody ogólnej, ponieważ jest bardziej szczegółowy? Czy istnieje sposób na wywołanie tego ogólnego?
Cóż, najprostszym rozwiązaniem byłoby nadanie 'Any'' testowi (_ :) 'generic - np.' Func test (_ o: T) '(nie jestem pewien, czy to bezpośrednio odpowiada na twoje pytanie). –
Hamish
Ogólna metoda nie jest w tym przypadku bardziej szczegółowa. Argument do 'test (_ o: Any)' jest jednym z _concrete type_ of "Any" (nawet jeśli sam typ jest protokołem), który może skutecznie opakować instancję 'Foo' jako jej argument. Każdy konkretny typ będzie bardziej szczegółowy niż typowy, a pierwszy będzie miał pierwszeństwo w rozdzielczości przeciążania, wywołując 'bar.test (...)'. Powinieneś zasadniczo unikać używania 'Any' jako konkretnego typu, a lepszym podejściem będzie subst. z nieskrępowanym generycznym opisanym przez @Hamish powyżej (w takim przypadku ograniczony typic będzie bardziej szczegółowy). – dfri