2017-04-11 1 views
0

私は、データベースのRealmを使用するプロジェクトで作業しています。私はちょうどキー値のコーディングを発見したので、TSVテーブルをオブジェクトプロパティ(テーブルの列見出しをキーとして使用)に変換する際に、この値を使用したいと考えています。今のところ、次のようになります:オブジェクトのプロパティを反復処理する(Realm、またはそうでないかもしれない)

let mirror = Mirror(reflecting: newSong) 
    for property in mirror.children { 
     if let index = headers.index(of: property.label!) { 
      newSong.setValue(headers[index], forKey: property.label!) 
     } else { 
      propertiesWithoutHeaders.append(property.label!) 
     } 
    } 

ミラーなしでプロパティを繰り返し処理する方法はありますか? Realmのドキュメント(あるいはAppleのKVCのドキュメント)でも、同じことを達成するためにfor property in Song.propertiesfor property in Song.self.propertiesのようなことをすることができると私は確信していました。

私がこれをやりたい主な理由は、同じ場所で私がこれを読んだと思うから、反復(またはKVC?)は文字列でしか動作しないと言っていたと思います。 Ints、Bools、およびDatesのように、オブジェクトであるプロパティは自動的にスキップされます(同じ方法でそれらを設定することはできません)。上記のコードは、実際に私のコードを簡略化したものである、私は現在、このようなオブジェクトをスキップしています実際のバージョンで:

let propertiesToSkip = ["title", "artist", "genre"] 
for property in mirror.children where !propertiesToSkip.contains(property.label!) { 
... 

私はこの.properties事を想像しましたか?または、上記のように名前を付けずに自動的にオブジェクト/クラスをスキップして、このように反復する方法はありますか?

ありがとう:)

答えて

1

いいえ、あなたはそれを想像していませんでした。 :)

レルムは、データベース内の各タイプのモデルのプロパティを含むスキーマを、親のRealmインスタンスまたはObjectの2つの場所で公開します。 ObjectインスタンスがObject.objectSchemaプロパティを介してそのオブジェクトのスキーマを露出

// Get an instance of the Realm object 
let realm = try! Realm() 

// Get the object schema for just the Mirror class. This contains the property names 
let mirrorSchema = realm.schema["Mirror"] 

// Iterate through each property and print its name 
for property in mirrorSchema.properties { 
    print(property.name) 
} 

レルム:Realmインスタンスで

レルム・スウィフト・ドキュメントのschema property of Realmを参照して、スキーマ・プロパティからどのような種類のデータを取得できるかの詳細を確認してください。 :)

+0

ありがとうございました!しかし、 'property.type!= Object'をチェックすると、" Binary operator!=は 'PropertyType'と 'Object.Type'型のオペランドには適用できません。これらをそれぞれに等しくなるようにキャストする方法は分かりますか?他の?あるいは、 'properties'に既にObjects/Listsが含まれていない可能性がありますか? –

+0

あなたは大歓迎ですよね、' property.type'はObjective-C enumです(https://github.com/realm/realm-cocoa/blob /255b2018c19398efaa52e816ccf59ef11be24cbd/Realm/RLMConstants.h#L51)実際のクラスの名前ではなく、列挙型の値を確実に比較する必要があります。 – TiM

関連する問題