Allgemeiner Aufruf mit Typ T in Swift

In meiner Anwendung möchte ich eine generische Methode erstellen, die ein Array von Objekten erstellt, das vom angegebenen Typ T abhängt.

Ich habe 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 aufrufe, damit sie weiß, welchen Typ sie intern erstellen soll. Ich denke, in Java und C # können Sie eine Methode wie die folgende verwenden:

object.getArray<Document>("key")

Wenn ich es so nenne, bekomme ich immer den Fehler:

Cannot explicitly specialize a generic function

Mein Fix bestand also darin, einen zusätzlichen Parameter zu definieren, der eine Instanz des Typs T enthält, damit er den Typ automatisch 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 keinen anderen Weg, um dieses Verhalten zu erreichen, ohne eine unbenutzte Instanz zu übergeben? Oder verstehe ich etwas falsch?

Weitere Tests

Nach der Antwort von jtbandes habe ich noch ein paar Tests gemacht. Ich habe versucht, den Typ durch Hinzufügen des zu erzwingenas im anruf.

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

Irgendwie ist der Typ immer der Basistyp, auch wenn ich den Typ mit angegeben habeas Stichwort. Ich weiß, dass das Beispiel nicht viel Sinn macht, aber es war nur zu Testzwecken.

Antworten auf die Frage(7)

Ihre Antwort auf die Frage