Подтвердить что ты не робот

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

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

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

    return objects.count > 0 ? objects : nil
}

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

4b9b3361

Ответ 1

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

let array = Array(results) // la fin

Ответ 2

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

Ответ 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 objects = Realm().objects(SomeObject).toArray(SomeObject) as [SomeObject]

    return objects.count > 0 ? objects : nil
}

Ответ 4

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.

Ответ 6

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

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