In meiner Anwendung Ich möchte eine generische Methode schaffen, die ein Array von Objekt erstellt depening auf dem angegebenen Typ T.Generics rufen mit Typ T in Swift
ich die folgende Funktion erstellt:
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
}
Jetzt möchte ich den Typ übergeben, wenn ich die Methode aufruft, also weiß sie, welchen Typ sie intern erzeugen soll. Ich denke, in Java und C# Sie eine Methode wie das verwenden können:
object.getArray<Document>("key")
Wenn ich es so nennen, habe ich immer die Fehlermeldung:
Cannot explicitly specialize a generic function
Also mein fix war ein zusätzlicher Parameter zu definieren, eine Instanz des Typs T enthält, so dass es automatisch die Art erkennt:
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
}
gibt es wirklich keine andere Möglichkeit, dieses Verhalten zu erhalten, ohne eine nicht verwendete Instanz zu übergeben? Oder unterscheide ich etwas falsch?
Weitere Tests
Nach der Antwort von jtbandes ich einige Tests gemacht haben. Ich habe versucht, den Typ zu erzwingen, indem ich die as
in dem Anruf hinzufüge.
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
Also irgendwie ist der Typ immer der Basistyp selbst habe ich den Typen mit dem as
Schlüsselwort angegeben. Ich weiß, dass das Beispiel nicht viel Sinn macht, aber es war nur für Testzwecke.
Oh nein Swift Typ System ist komplett kaputt (noch einmal). Außerdem "funktioniert" es, wenn die Basisklasse von NSObject geerbt wird. [Code hier] (https://gist.github.com/xlc/ba7f213e1f94cc1cada5) –
Die Antwort ist sehr einfach. Sie müssen den Typ irgendwie angeben, also tun Sie es als 'object.getArray (" Schlüssel ") als [Dokument]' – thesummersign