领域迁移中的访问列表 属性
Access list property in Realm migration
我正在尝试访问迁移块中的 List<String>
属性。
我的数据库对象如下所示:
@objcMembers
public class Foo: Object {
let bar: List<String> = .init()
}
在我的迁移块中,我正在尝试访问 bar
,但似乎无法访问:
static func migrateFoo(_ migration: RealmSwift.Migration) {
migration.enumerateObjects(ofType: Foo.className()) { old, _ in
let test = old?["bar"] as? List<String>
let test2 = old?["bar"] as? [String]
let test3 = old?["bar"]
}
}
test
和test2
都是nil
。 test3
的输出显示如下:
(lldb) po test3
▿ Optional<Any>
- some : List<string> <0x600001fb5f80> (
[0] someContent
)
我需要将 test3
转换成什么才能访问列表?
编辑
我想访问 bar
属性 中的元素,因此我认为将迁移对象的 bar
属性 转换为 List<String>
,毕竟这是数据类型就足够了。最后我想要的是:
for element in test {
print(element) // `element` should be a `String` here
}
我不知道你想做的事情的全部范围是什么,但对这个问题的具体回答是:
let test = [ old!["bar"] ]
编辑
OP 添加了一些附加信息。目标是能够访问条形列表 属性 中的值。这是一些快速代码,它遍历该列表并将索引和对象(作为字符串)输出到控制台。
migration.enumerateObjects(ofType: Foo.className()) { oldItem, newItem in
let dynamicBarList = oldItem?.dynamicList("stringList")
if let list = dynamicBarList {
let myArray = list._rlmArray
let lastIndex = myArray.count - 1
for index in 0...lastIndex {
let object = myArray.object(at: index)
let value = "\(object)" //make the NSTaggedPointerString a String
print(index, value)
}
}
}
您可以将您的列表转换为 DynamicObjects 列表(对象接口,允许对象的非类型化 getter 和 setter):
if let old = old?["bar"] as? List<DynamicObject> {
for i in 0..<old.count {
let p = old[i]
print(p) // someContent
}
}
我正在尝试访问迁移块中的 List<String>
属性。
我的数据库对象如下所示:
@objcMembers
public class Foo: Object {
let bar: List<String> = .init()
}
在我的迁移块中,我正在尝试访问 bar
,但似乎无法访问:
static func migrateFoo(_ migration: RealmSwift.Migration) {
migration.enumerateObjects(ofType: Foo.className()) { old, _ in
let test = old?["bar"] as? List<String>
let test2 = old?["bar"] as? [String]
let test3 = old?["bar"]
}
}
test
和test2
都是nil
。 test3
的输出显示如下:
(lldb) po test3
▿ Optional<Any>
- some : List<string> <0x600001fb5f80> (
[0] someContent
)
我需要将 test3
转换成什么才能访问列表?
编辑
我想访问 bar
属性 中的元素,因此我认为将迁移对象的 bar
属性 转换为 List<String>
,毕竟这是数据类型就足够了。最后我想要的是:
for element in test {
print(element) // `element` should be a `String` here
}
我不知道你想做的事情的全部范围是什么,但对这个问题的具体回答是:
let test = [ old!["bar"] ]
编辑
OP 添加了一些附加信息。目标是能够访问条形列表 属性 中的值。这是一些快速代码,它遍历该列表并将索引和对象(作为字符串)输出到控制台。
migration.enumerateObjects(ofType: Foo.className()) { oldItem, newItem in
let dynamicBarList = oldItem?.dynamicList("stringList")
if let list = dynamicBarList {
let myArray = list._rlmArray
let lastIndex = myArray.count - 1
for index in 0...lastIndex {
let object = myArray.object(at: index)
let value = "\(object)" //make the NSTaggedPointerString a String
print(index, value)
}
}
}
您可以将您的列表转换为 DynamicObjects 列表(对象接口,允许对象的非类型化 getter 和 setter):
if let old = old?["bar"] as? List<DynamicObject> {
for i in 0..<old.count {
let p = old[i]
print(p) // someContent
}
}