【问题标题】:How to convert an array to List in Realm?如何将数组转换为领域中的列表?
【发布时间】:2021-05-04 07:07:33
【问题描述】:

在将 jsonData 写入 Realm 时,将 Realm 类型 List 数组转换为 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)
        }
        }
    }

我试过了,但是数组是空的

var newArr = Array(movieRealm.genreIDs)
newArr = movie.genreIDs ?? []

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

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

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

【问题讨论】:

  • 你能给我看看结果吗,我可以帮你。
  • 你的意思是什么结果?
  • 您要转换的数据类型。
  • 感谢您的帮助,任务已解决

标签: swift realm


【解决方案1】:

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

但是等等! movieRealm.genreIDs 是一个 let 常量,所以无论如何你都不能分配给它。您真正的问题是您没有正确声明 genreIDs 属性。

如果您按照docs 的说明如何声明List 类型的属性:

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

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

movieRealm.genreIDs.append(objectsIn: move.genreIDs ?? [])

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

【讨论】:

  • 非常感谢您的解释!我没有考虑将 int 数组附加到 List,而只是分配为其他属性。现在我将知道如何使用 List :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多