RealmSwift: преобразование результатов в Swift Array

Что я хочу реализовать:

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

    return objects.count > 0 ? objects : nil
}

Как вернуть объект как [SomeObject], если Results?

+96
источник поделиться
6 ответов

Странно, ответ очень прямолинейный. Вот как я это делаю:

let array = Array(results) // la fin
+238
источник

Если вам абсолютно необходимо преобразовать Results в Array, имейте в виду, что производительность и память накладные, так как Results ленив. Но вы можете сделать это в одной строке, как results.map { $0 } в swift 2.0 (или map(results) { $0 } в 1.2).

+27
источник
другие ответы

Связанные вопросы


Похожие вопросы

Я нашел решение. Создано расширение по результатам.

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

и используя, например,

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

    return objects.count > 0 ? objects : nil
}
+8
источник

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

Использование

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
}

Альтернатива: использование дженериков

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
}
+5
источник

Я не уверен, если есть эффективный способ сделать это.

Но вы можете сделать это, создав массив Swift и добавив его в цикл.

class func getSomeObject() -> [SomeObject]? {
    var someObjects: [SomeObject] = []
    let objects = Realm().objects(SomeObject)
    for object in objects{
        someObjects += [object]
    }
    return objects.count > 0 ? someObjects : nil
}

Если вы чувствуете, что это слишком медленно. Я рекомендую вам напрямую передать объект Realm Results.

+2
источник

Не рекомендуется преобразовывать результаты в массив, потому что результаты ленивы. Но если вам нужно попробовать это:

func toArray<T>(ofType: T.Type) -> [T] {
    return flatMap { $0 as? T }
}

но лучше всего передать результаты везде, где вам нужно. Также вы можете преобразовать результаты в список вместо массива.

List(realm.objects(class))

Если первая функция не работает, вы можете попробовать следующее:

var refrenceBook:[RefrenceProtocol] = []
let faceTypes = Array(realm.objects(FaceType))
refrenceBook = faceTypes.map({$0 as FaceType})
+2
источник

Посмотрите другие вопросы по меткам или Задайте вопрос