2016-06-01 16 views
1

Ich benutze Struct in Swift.iterieren über Strukturattribute in Swift

class Constants { 
    struct const { 
     static let signupFirstName = "signupFirstName" 
    } 
} 

Ich möchte die Struktur iterieren. Für Iterieren Ich verwende:

let mirrored_object = Mirror(reflecting: Constants.const()) 
for (index, attr) in mirrored_object.children.enumerate() { 
     if let property_name = attr.label as String! { 
      print("Attr \(index): \(property_name) = \(attr.value)") 
     } 
} 

Aber es in den Code nicht wegen static Wert eingeben. Gibt es eine Möglichkeit, diese struct zu iterieren?

Antwort

0

Sie können es direkt tun, indem Sie die Variable auf Klassenebene Zugriff auf

if let property_value = const.signupFirstName as String! { 
    print("hello \(property_value)") 
} 

Seien Sie sicher, dass es aus der Klasse es sich von selbst const()const keine Instanz zuzugreifen. Da die Variable statisch ist, dass Sie nicht von instance zugreifen können, müssen Sie direkt die class

0

Da statische Mitglieder technisch Teil des Typs sind verwenden und nicht die Instanz, würden Sie brauchen es auf diese Weise zu nähern zu reflektieren von der Art selbst:

let mirrored_object = Mirror(reflecting: Constants.const.self) 

wird jedoch zu diesem Zeitpunkt nicht umgesetzt zu werden scheinen arbeiten Swift automatische Reflexion für die Typen sich nicht, so dass auch die über die Linie.

Das lässt eine letzte Option übrig, die Ihren eigenen benutzerdefinierten Spiegel definiert, um eine Instanz Ihres Typs zu reflektieren. Das könnte wie folgt aussehen:

class Constants { 
    struct const : CustomReflectable { 
     static let signupFirstName = "signupFirstName" 
     func customMirror() -> Mirror { 
      return Mirror(self, children: ["signupFirstName" : const.signupFirstName]) 
     } 
    } 
} 

Wenn Sie Ihren Code mit einer CustomReflectable Implementierung ähnlich dem oben, Ihre Schleife ändern durch die Strukturkomponenten zu durchlaufen wird nun arbeiten.

Swift-Reflektion wird eventuell besser aus der Box kommen, Sie sollten vielleicht bis dahin einen anderen Ansatz ausprobieren.

+0

Vielen Dank für Ihre Antwort. Angenommen, ich habe mehrere Zahlen von statischen Variablen im Struct wie: static let signupLastName = "signupLastName", statische let signupEmail = "signupEmail" usw. Jetzt anstelle von "return Mirror (self, children: [" signupFirstName ": const.signupFirstName]) ", Möchte ich diese Struktur dynamisch loopen. Wie kann ich? Bitte helfen Sie. – Rupshikha

+0

@ user3897036 Leider gibt es keine Möglichkeit, dynamisch durch irgendetwas zu durchlaufen, um den benutzerdefinierten Spiegel zu erstellen. Der Initialisierer für MirrorType akzeptiert nur ein Dictionary _literal_, was letztendlich bedeutet, dass Sie genau die Werte übergeben müssen, die Sie reflektieren möchten, und es gibt keine Möglichkeit zum Schleifen oder Generieren basierend auf Variablen usw. :(Auch hier wird Swift-Reflektion besser die Straße hinunter, aber im Moment ist es sehr begrenzt und nicht sehr nützlich. Vielleicht möchten Sie einen anderen Ansatz für das, was Sie erreichen wollen ausprobieren. –

+0

Vielen Dank .. Ihre Lösung funktioniert wie Charme .... :) – Rupshikha