2016-09-06 7 views
5

構造体のすべてのプロパティを反復処理する簡単な方法はありますか?私が慣れている非静的プロパティのアプローチはMirrorですが、構造体に静的プロパティのみが含まれている場合は空の配列を返します。ここで私が達成しようとしているものの例です:構造体の静的プロパティを反復処理する

struct Tree { 
    static let bark = "Bark" 
    static let roots = "Roots" 
} 

let treeParts = [String]() 
// insert code here to make treeParts = ["Bark", "Roots"] 
+0

私はこれを試していませんが、構造体の_instance_またはメタタイプをミラーリングしていますか?私は 'Tree.type'をミラーリングする必要がある静的なプロパティを取得すると思います。 –

+0

.typeが何を意味するのかよく分かりません。私の構造体にはそのプロパティはありませんが、自分自身で試してみました。何も得られませんでした。 – mattgabor

+0

申し訳ありませんが、「Tree.self」と言っていたはずです(私は大文字T型を考えていましたが、これはメタタイプオブジェクトではなく型名です)。 –

答えて

0

私も、私は以下の例を作ったこれを行う方法の関心を持っているので。構造体をシングルトンにする静的インスタンス変数に加えて、静的でないプロパティを持つ構造体を作成するだけではどうでしょうか。次のコードサンプルでは、​​Personオブジェクトの値をJSON辞書にマッピングするための使用例を、REST APIの命名規則を使用して詳しく説明します。 PersonJSONKeysのプロパティ名はPersonのプロパティ名と一致する必要があります。

allProperties()のコードは、How to loop over struct properties in Swift?です。この関数を簡単に変更すると、構造体プロパティの値のみを返すことができます。

struct PersonJSONKeys: PropertyLoopable { 
    static let instance: PersonJSONKeys = PersonJSONKeys() 
    private init() {} 

    let name = "name" 
    let firstName = "first_name" 
    let age = "age" 
} 

struct Person: PropertyLoopable { 
    let name = "Doe" 
    let firstName = "John" 
    let age = "18" 
} 

let person = Person() 
let personProperties = person.allProperties() 
var personJSON: [String:Any] = [:] 

for jsonProperty in PersonJSONKeys.instance.allProperties() { 
    let propertyName = jsonProperty.key 
    let jsonKey = jsonProperty.value as! String 
    personJSON[jsonKey] = personProperties[propertyName] 
} 

構造体は、現在、シングルトンであるので、そのプロパティの全ては一度だけ初期化され、スレッドの安全性は、その静的インスタンス変数によって与えられます。