Chamada de genéricos com o tipo T no Swift
No meu aplicativo, quero criar um método genérico que crie uma matriz de objetos dependendo do tipo T.
Eu criei a seguinte função:
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
}
Agora eu quero passar o tipo quando chamo o método, para que ele saiba qual o tipo que deve criar internamente. Eu acho que em Java e C # você pode usar um método como esse:
object.getArray<Document>("key")
Quando eu chamo assim, sempre recebo o erro:
Cannot explicitly specialize a generic function
Portanto, minha correção foi definir um parâmetro adicional que contenha uma instância do tipo T para detectar automaticamente o 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
}
Realmente não há outra maneira de obter esse comportamento sem passar por uma instância não utilizada? Ou estou entendendo algo errado?
Teste aprofundado
Após a resposta do jtbandes, fiz mais alguns testes. Tentei forçar o Type adicionando oas
na chamada.
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
Então, de alguma forma, o tipo é sempre o tipo base, mesmo que eu tenha especificado o tipo com oas
palavra-chave Eu sei que o exemplo não faz muito sentido, mas foi apenas para fins de teste ..