Nella mia applicazione Voglio creare un metodo generico che crea una serie di oggetti depening sul dato tipo T.Generics chiamano con il tipo T a Swift
ho creato la seguente funzione:
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
}
Ora voglio passare il tipo quando chiamo il metodo, in modo che sappia quale tipo deve creare internamente. Penso che in Java e C# è possibile utilizzare un metodo simile:
object.getArray<Document>("key")
Quando chiamo così, ho sempre l'errore:
Cannot explicitly specialize a generic function
Quindi il mio fix è stato quello di definire un parametro aggiuntivo contenente un'istanza del tipo T in modo che rileva automaticamente il tipo:
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
}
c'è davvero altro modo per ottenere che il comportamento senza passare un'istanza inutilizzato? O sto fraintendendo qualcosa?
ulteriori test
Dopo la risposta di jtbandes ho fatto un po 'di test. Ho provato a forzare il Tipo aggiungendo il as
alla chiamata.
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
Così in qualche modo il tipo è sempre il tipo di base, anche ho specificato il tipo con la parola chiave as
. So che l'esempio non ha molto senso, ma era solo a scopo di test ..
Oh no Il sistema di tipo Swift è completamente guasto (ancora una volta). Inoltre, "funziona" se la classe base è ereditata da NSObject. [codice qui] (https://gist.github.com/xlc/ba7f213e1f94cc1cada5) –
La risposta è molto semplice. devi specificare il tipo in qualche modo in modo da farlo come 'object.getArray (" chiave ") come [Documento]' – thesummersign