RealmSwift:将结果转换为Swift数组

Sah*_*oor 134 realm ios swift

我想要实现的内容:

class func getSomeObject() -> [SomeObject]? {
    let objects = Realm().objects(SomeObject)

    return objects.count > 0 ? objects : nil
}
Run Code Online (Sandbox Code Playgroud)

[SomeObject]如果相反,我怎样才能返回对象Results

Maz*_*yod 361

很奇怪,答案非常直截了当.我是这样做的:

let array = Array(results) // la fin
Run Code Online (Sandbox Code Playgroud)

  • 它返回实体的零变量(初始) (4认同)
  • @thesummersign Realm最近发生了很大变化,但有一点是肯定的:上面的代码返回一个由结果迭代器构造的Swift`Array`. (2认同)
  • 我同意@NikKov,它似乎正在返回该实体的零vars;( (2认同)
  • @Jon 你怎么看到它们为零?似乎因为它们很懒惰,所以当您看到它们停在调试点时,它们看起来是空的,但是如果您将它们打印出来,它会访问它们并显示正确的值(对我而言)。 (2认同)

seg*_*ins 30

如果你绝对必须转换你ResultsArray,请记住,这是一个性能和内存开销,因为Results是懒惰.但你可以在一行中完成它,如results.map { $0 }swift 2.0(或map(results) { $0 }1.2).

  • 如果您不想将Realm的依赖项泄露给项目中的太多类,那么这种转换是不是必需? (29认同)
  • `map {$ 0}`将在Swift 3中返回`LazyMapRandomAccessCollection`,所以@Mazyod答案更好. (14认同)

Sah*_*oor 18

我找到了解决方案.在结果上创建扩展.

extension Results {
    func toArray<T>(ofType: T.Type) -> [T] {
        var array = [T]()
        for i in 0 ..< count {
            if let result = self[i] as? T {
                array.append(result)
            }
        }

        return array
    }
}
Run Code Online (Sandbox Code Playgroud)

和使用像

class func getSomeObject() -> [SomeObject]? {
    let objects = Realm().objects(SomeObject).toArray(SomeObject) as [SomeObject]

    return objects.count > 0 ? objects : nil
}
Run Code Online (Sandbox Code Playgroud)

  • `for var i = 0; 我<count; i ++应该替换为`for in in 0 .. <count` (4认同)

Nev*_*oon 7

使用Swift 4.2,它非常简单:

extension Results {
  func toArray() -> [Element] {
    return compactMap {
      $0
    }
  }
Run Code Online (Sandbox Code Playgroud)

所有必需的泛型信息已经是Results我们扩展的一部分。


Jas*_*bas 6

斯威夫特3

extension Results {
    func toArray<T>(ofType: T.Type) -> [T] {
        var array = [T]()
        for i in 0 ..< count {
            if let result = self[i] as? T {
                array.append(result)
            }
        }

        return array
    }
}
Run Code Online (Sandbox Code Playgroud)

用法

class func getSomeObject() -> [SomeObject]? {
   let defaultRealm = try! Realm()
    let objects = defaultRealm.objects(SomeObject.self).toArray(ofType : SomeObject.self) as [SomeObject]

    return objects.count > 0 ? objects : nil
}
Run Code Online (Sandbox Code Playgroud)

替代方案:使用泛型

class func getSomeObject() -> [T]? {
        let objects = Realm().objects(T.self as! Object.Type).toArray(ofType : T.self) as [T]

        return objects.count > 0 ? objects : nil
}
Run Code Online (Sandbox Code Playgroud)

  • 你为什么要让你的生活如此艰难?看看接受的答案...... (10认同)

abd*_*lek 5

这是在一行中Results使用Swift 3扩展名转换为Array 的另一种方法。

extension Results {
    func toArray() -> [T] {
        return self.map { $0 }
    }
}
Run Code Online (Sandbox Code Playgroud)

对于Swift 4和Xcode 9.2

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

不建议使用Xcode 10 flatMap,可以将其compactMap用于映射。

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