领域迁移中的访问列表 属性

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

testtest2都是niltest3 的输出显示如下:

(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
    }
}