2016-05-19 4 views
1

Ich frage mich, ob es möglich ist, einen Swift-Typ dynamisch zu erhalten. Zum Beispiel, sagen wir folgende verschachtelte Strukturen haben:Ist es möglich, einen Swift-Typ aus einer Zeichenfolge zu erhalten?

struct Constants { 

    struct BlockA { 
    static let kFirstConstantA = "firstConstantA" 
    static let kSecondConstantA = "secondConstantA" 
    } 

struct BlockB {  
    static let kFirstConstantB = "firstConstantB" 
    static let kSecondConstantB = "secondConstantB" 
    } 

    struct BlockC { 
    static let kFirstConstantC = "firstConstantBC" 
    static let kSecondConstantC = "secondConstantC" 
    } 
} 

Es ist möglich Wert von kSeconConstantC aus einer Variablen zu erhalten). Wie:

let variableString = "BlockC" 
let constantValue = Constants.variableString.kSecondConstantC 

So etwas wie NSClassFromString, vielleicht?

+0

Wert kann nicht als Bezeichner verwendet werden, wie ich denke, ich denke, es ist nicht möglich –

+0

können Sie wie if (variableString == "BlockC") dann etwas tun –

+0

Danke für Ihre Empfehlung, aber die Idee dahinter ist zu reduzieren Code. Ich würde eine (wenn vorhanden) eine Lösung bevorzugen, wie ich erwähnt habe, stattdessen mehrere if-else für jeden Fall schreiben. – RFG

Antwort

2

Nein, es ist noch nicht möglich (zumindest als Sprachfeature).

Was Sie brauchen, ist Ihre eigene Typ Registry. Selbst bei einem Typ-Registrierung, würden Sie nicht in der Lage sein static Konstanten zu bekommen, wenn Sie ein Protokoll für das hatte:

var typeRegistry: [String: Any.Type] = [:] 

func indexType(type: Any.Type) 
{ 
    typeRegistry[String(type)] = type 
} 

protocol Foo 
{ 
    static var bar: String { get set } 
} 

struct X: Foo 
{ 
    static var bar: String = "x-bar" 
} 

struct Y: Foo 
{ 
    static var bar: String = "y-bar" 
} 

indexType(X) 
indexType(Y) 

typeRegistry // ["X": X.Type, "Y": Y.Type] 

(typeRegistry["X"] as! Foo.Type).bar // "x-bar" 
(typeRegistry["Y"] as! Foo.Type).bar // "y-bar" 

A-Typ-Registrierung ist etwas, das Ihre Arten registriert eine benutzerdefinierte Hashable Typ (sagen wir ein String oder ein Int). Sie können diese Registertyp dann verwenden, um registrierte Typen mithilfe benutzerdefinierter Bezeichner zu referenzieren (in diesem Fall eine String).

Da Any.Type an sich nicht so nützlich ist, konstruierte ich eine Schnittstelle Foo durch die ich auf eine statische Konstante bar zugreifen konnte. Weil ich weiß, dass X.Type und Y.Type beide Foo.Type entsprechen, zwang ich eine Besetzung und las die bar Eigenschaft.

+0

Cool! Kannst du ein bisschen erklären, was hier vor sich geht? –

+0

Danke, ich werde versuchen, so zu folgen. – RFG

+0

Dies ist ordentlich, obwohl beachten Sie, dass, wenn Sie wissen, dass die Typen in einer bestimmten Registrierung immer zu einem bestimmten Protokoll entsprechen, sollten Sie die Registrierung '[String: Foo.Type]', um die stinkende Kraft Downcasting zu beseitigen. – Hamish

Verwandte Themen