2014-10-07 9 views
11

Ich verstehe, dass mit Swift Sie eine funktionsspezifische generic mit dieser Form angeben:Generika in Index für die schnelle

func someFunction<T>(type: T.Type) {...} 

Allerdings ist es möglich, etwas ähnliches mit Indizes zu tun? Wo Sie einen Typen in den Klammern angeben können, wie so:

subscript<T>(type: T.Type) -> T {...} 

EDIT: Aktualisierte Lösung basierend auf der akzeptierte Antwort

subscript(type: AnyClass.Type) -> Any { 
    return sizeof(type) 
} 

EDIT 2: Bei der Untersuchung scheint es, dass ich nicht wirklich mit diesem Index verwenden kann . Ich bekomme "CLASS ist nicht identisch mit AnyClass.Type" also bin ich wieder auf Platz eins

+1

Dang aber wäre das nicht genial sein. Dies ist frustrierend, da es nicht unterstützt wird. Ein Index ist eigentlich nur eine spezielle Funktion, daher gibt es keinen architektonischen Grund, warum der Compiler dies nicht unterstützen könnte. Vielleicht bekommen wir es in einer zukünftigen Version der Sprache. – devios1

Antwort

9

Sie können subscript nicht als generische Funktion definieren, aber Sie können einen generischen Typ verwenden, wenn er auf Klassenebene deklariert ist.

Zum Beispiel können sagen, dass Sie eine Klasse machen wollen, wo die subscript eine Art nimmt T und gibt einen Typ U. Das wäre in etwa so aussehen:

class SomeClass<T, U> { 
    subscript(someParameter: T) -> U { 
     /* something that returns U */ 
    } 
} 

Zum Beispiel könnten Sie eine Converter Klasse erstellen, die die subscript Funktion von Typ konvertieren TU eingeben:

Hinweis: Dies ist ein sehr gekünstelt Zum Beispiel würde ich das normalerweise nicht so machen.

class Converter<T, U> { 
    var _converter: (T -> U) 

    init(converter: (T -> U)) { 
     _converter = converter 
    } 

    subscript(input: T) -> U { 
     let output = _converter(input) 
     return output 
    } 
} 

var convert = Converter(converter: { 
    (input: Int) -> String in 
    return "The number is: \(input)" 
}) 

let s = convert[1] 
println(s) // The number is: 1 
+0

In meinem Szenario kann ich keine generische Klasse verwenden. Aber ich entwurzle deine Antwort, weil sie gute Informationen für andere hat. –

+0

Okay, das macht Sinn. Aber jetzt eine Frage von mir: Wie kann man den generischen Typ ändern, wenn man einen anderen im Index verwenden will? –

+0

okay danke. –

0

Ich glaube nicht, dass das möglich ist. Stattdessen können Sie Any oder AnyObject verwenden und das Ergebnis der Funktion an den angegebenen Typ übergeben.

subscript(type: AnyObject) -> AnyObject { 
    ... 
} 

Tipp: Statt type: T.Type, type: T verwenden.

+0

Ich versuchte 'Typ: T', aber ich bekomme immer den Fehler" Erwarteter Name des Mitglieds oder Konstruktor Anruf nach Typ Name " –

+0

ah dann T ist keine Klasse? –

+0

T ist eine Klasse wie UInt8. Ich muss UInt8.self eingeben, um das zu erstellen. Auch, wie kann ich eine Eingabe der Eingabe 'type' in etwas wie 'sizeof()' –