Свойство списка доступа в миграции областей - PullRequest
0 голосов
/ 06 января 2020

Я пытаюсь получить доступ к свойству 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
}

Ответы [ 2 ]

0 голосов
/ 07 января 2020

Вы можете преобразовать свой список в список DynamicObjects (интерфейс объекта, который позволяет использовать нетипизированные методы получения и установки для объектов):

if let old = old?["bar"] as? List<DynamicObject> {
    for i in 0..<old.count {
        let p = old[i]
        print(p) // someContent
    }
}
0 голосов
/ 07 января 2020

Я не знаю, какова полная область того, что вы пытаетесь сделать, но конкретный c ответ на вопрос будет:

let test = [ old!["bar"] ]

РЕДАКТИРОВАТЬ

ОП добавил дополнительную информацию. Цель состоит в том, чтобы иметь возможность доступа к значениям в свойстве панели списка. Вот небольшой код ie, который перебирает этот список и выводит индекс и объект (в виде строки) на консоль.

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)
        }
    }
}
...