2016-06-01 7 views
1

私は構造体をswiftで使用しています。Swiftで構造体属性を反復処理する

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

私は構造体を反復したい。反復のために私が使用しています:

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)") 
     } 
} 

しかし、それが原因でstatic値のコードに入りませんが。これを反復する方法はありますかstruct

答えて

0

あなたは

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

は、クラスそれ自己constないインスタンスconst()からアクセスしてくださいクラスレベルで変数にアクセスして直接それを行うことができます。変数は、あなたがinstanceからアクセスすることはできません静的なので、あなたが直接、静的メンバーは技術的にタイプはなく、インスタンスの一部であるので、あなたが反映するように、それに近づくために、この方法が必要になりclass

0

を使用する必要があります型自体に:

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

しかし、タイプ自身のためにスウィフトの自動反映は、現時点では実装されていないようなので、でも、上記の行は動作しません。

これは、タイプのインスタンスに反映するための独自のカスタムミラーを定義する最後のオプションを残します。

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

あなたは上記と同様CustomReflectableの実装を使用してコードを変更した場合、構造体のメンバを反復処理するためにあなたのループが今動作します:それはこのような何かを見ることができます。

スウィフト・リフレクションは、最終的にはすぐれたものになるでしょう。それまでは別のアプローチを試してみるとよいでしょう。

+0

ありがとうございます。構造体に複数の静的変数があるとします。静的let signupLastName = "signupLastName"、静的let signupEmail = "signupEmail"など。ここで、 "return Mirror(self、children:[" signupFirstName ":const.signupFirstName] ) "、この構造体を動的にループしたい。どのようにできるのか?助けてください。 – Rupshikha

+0

@ user3897036残念ながら、何かを動的にループしてカスタムミラーを作成する方法はありません。 MirrorTypeのイニシャライザは辞書_literal_のみを受け付けます。これは最終的に、反映させたい正確な値を渡す必要があり、変数などに基づいてループや生成の可能性がないことを意味します:(再びSwiftリフレクションが良くなります道路を下っていますが、今は非常に限られており、それほど有用ではありません。あなたが達成しようとしていることに対して、別のアプローチを試してみてください。 –

+0

あなたのソリューションは魅力的です。 – Rupshikha