W mojej aplikacji Chcę utworzyć rodzajowego metody, która tworzy tablicę obiektu depening na dany typ T.Generics zadzwonić z typu T w Swift
stworzyłem następującą funkcję:
func getArray<T : ROJSONObject>(key:String) -> T[] {
var elements = T[]()
for jsonValue in getValue(key).array! {
var element = T()
element.jsonData = jsonValue
elements.append(element)
}
return elements
}
Teraz chcę przekazać typ, gdy wywołuję metodę, więc wie, który typ powinien tworzyć wewnętrznie. Myślę, że w Java i C# można użyć metody tak:
object.getArray<Document>("key")
Kiedy ja nazywam go tak, zawsze pojawia się błąd:
Cannot explicitly specialize a generic function
Więc moja poprawka było określenie dodatkowego parametru zawierający instancję typu T, więc jest automatycznie wykrywa typ:
func getArray<T : ROJSONObject>(key:String, type:T) -> T[] {
var elements = T[]()
for jsonValue in getValue(key).array! {
var element = T()
element.jsonData = jsonValue
elements.append(element)
}
return elements
}
czy naprawdę nie ma innego sposobu, aby to zachowanie bez przechodzenia nieużywany instancji? Czy może coś niewłaściwie?
dalsze badania
Po odpowiedzią jtbandes miałem trochę więcej badań. Próbowałem wymusić typ, dodając w rozmowie as
.
class Person {
init() { }
func getWorkingHours() -> Float {
return 40.0
}
}
class Boss : Person {
override func getWorkingHours() -> Float {
println(100.0)
return 100.0
}
}
class Worker : Person {
override func getWorkingHours() -> Float {
println(42.0)
return 42.0
}
}
func getWorkingHours<T : Person>() -> T {
var person = T()
person.getWorkingHours()
return person
}
var worker:Worker = getWorkingHours() as Worker
var boss:Boss = getWorkingHours() as Boss
worker.getWorkingHours() // prints out 40.0 instead of 42.0
boss.getWorkingHours() // prints out 40.0 instead of 100.0
Więc jakoś typ jest zawsze taki typ bazowy nawet mam określony typ ze słowem kluczowym as
. Wiem, że przykład nie ma większego sensu, ale był przeznaczony tylko do testów ..
O, żaden system typu Swift nie jest całkowicie uszkodzony (jeszcze jeden raz). Ponadto "działa", jeśli klasa podstawowa jest dziedziczona z NSObject. [tutaj kod] (https://gist.github.com/xlc/ba7f213e1f94cc1cada5) –
Odpowiedź jest bardzo prosta. musisz określić typ w jakiś sposób, więc robisz to jako 'object.getArray (" key ") jako [Document]' – thesummersign