迭代对象的属性(在Realm中,或者可能不是)

时间:2017-04-11 20:39:02

标签: swift realm key-value-coding

我正在开发一个使用Realm作为数据库的项目(稍后会进入图片)。我刚刚发现了键值编码,我想用它将TSV表转换为对象属性(使用表中的列标题作为键)。现在它看起来像这样:

    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 个答案:

答案 0 :(得分:3)

不,你没想到它。 :)

Realm在两个地方公开包含数据库中每种模型类型属性的模式:在父Realm实例中,或在Object本身中。

Realm实例中:

// 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 Object实例通过Object.objectSchema属性公开该对象的架构。

查看Realm Swift文档中的schema property of Realm,了解有关可以从架构属性中获取哪种数据的更多信息。 :)