Mam bardzo prosty Playground:błąd Swift z rodzajowego tablicy
protocol MyProtocol {}
struct MyType: MyProtocol {}
class MyClass <T: MyProtocol> {
func myFunction(array: [T]) {
if let myArray = array as? [MyType] {
println("Double!")
}
}
}
let instance = MyClass<MyType>()
let array = [MyType(), MyType()]
instance.myFunction(array)
Potem mówi "MyType is not a subtype of 'T'
" na linii if let
. Cóż, myślę jednak, że MyType
i są kompatybilne.
Kiedy zmodyfikowana oświadczenie if let
, to faktycznie działa:
if let first = array.first as? MyType
Ale teraz nie mogę rzucić array
do [MyType]
I (wiem, wiem, że jest statyczny specyfikacja wpisując Swift). zastanawiam się, jaki jest problem. Moje rozumienie o generycznych? Czy jest to ograniczenie języka Swift? Jeśli tak, czy jest jakiś sposób, aby to zrobić?
Z góry dziękuję.
Jeszcze raz doskonałe wyjaśnienie. Chociaż wydaje mi się, że typy ogólne nie wydają się być dobrą koncepcją językową, ponieważ ich użycie wymaga po prostu głowy jajka. –
Bardzo dziękuję za szybką i szczegółową odpowiedź. Wystarczy mi przekonać, że nie mogę tego zrobić w ten sposób, ale teraz ... jak mogę to zrobić? Dokładnie to, czego chcę (a właściwie "Double"! 'w pytaniu oryginalnym jest jego śladem,) jest klasą z rodzajami, a jej ogólny typ jest albo podwójny, albo int.Chcę wiedzieć, jaki typ minął i wrzucić go do odpowiedniego typu tablicy. Próbowałem to zrobić tak jak wyżej (i okazało się to niemożliwe, kiedy mnie uczysz). Czy masz jakieś pomysły? Wybacz mi moją chciwość. – Akkyie
Być może sam to rozwiązałem, implementując niektóre funkcje protokołu. Dzięki. – Akkyie