如何在 Realm 中将数组转换为列表?

Abr*_*d18 3 realm swift

将 jsonData 写入 Realm 时,将 Realm 类型List < Int>数组转换为 Int 数组[Int]时遇到问题。

 struct Movies: Codable {
        let genreIDs: [Int]?
 }

 class CachedMovies: Object {
      let genreIDs: List<Int>?
 }

 func saveMovies(movies:[Movies]) {
    do {
        let realm = try! Realm()
        try realm.write {
        movies.forEach { (movie) in
            let movieRealm = CachedMovies()
            movieRealm.id = movie.id ?? 0
            movieRealm.title = movie.title ?? ""
            movieRealm.genreIDs = movie.genreIDs ?? [] // here's error: Cannot assign value of type '[Int]?' to type 'List<Int>?'
            realm.add(movieRealm, update: .modified)
        }
        }
    }
Run Code Online (Sandbox Code Playgroud)

我尝试了这个,但数组为空

var newArr = Array(movieRealm.genreIDs)
newArr = movie.genreIDs ?? []
Run Code Online (Sandbox Code Playgroud)

我还尝试使用此扩展将列表类型更改为结果并将结果转换为整数,但它不起作用。

extension Results {
     func toArray<T>(type: T.Type) -> [T] {
     return compactMap { $0 as ? T }
     }
    }
Run Code Online (Sandbox Code Playgroud)

您能帮我如何正确分配数组吗?

Swe*_*per 7

请注意,您的问题不是转换List为数组,而是将数组转换为List. 您已经知道如何执行前者:Array(someList),但由于您将数组 ( movie.genreIDs ?? []) 分配给List属性 ( movieRealm.genreIDs),因此需要将数组转换为List.

可是等等!movieRealm.genreIDs是一个let常量,所以无论如何你都不能分配给它。你真正的问题是你没有genreIDs正确申报财产。

如果您遵循有关如何声明类型属性的文档List

class CachedMovies: Object {
     // genreIDs should not be optional
     let genreIDs = List<Int>()
}
Run Code Online (Sandbox Code Playgroud)

您会发现不需要将数组转换为List. 您可以将数组的内容添加到List,因为列表不为零:

movieRealm.genreIDs.append(objectsIn: move.genreIDs ?? [])
Run Code Online (Sandbox Code Playgroud)

请注意,如果您确实想要一个可选的列表属性(可以为 nil、空或有元素的属性),Realm 不支持这一点。