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



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



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

return objects.count > 0 ? objects : nil
}


как я могу вернуть объект как [SomeObject] вместо if Results?

936   9  

9 ответов:

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

let array = Array(results) // la fin

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

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

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
}

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
}

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

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

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

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

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

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

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

List(realm.objects(class))

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

var refrenceBook:[RefrenceProtocol] = []
let faceTypes = Array(realm.objects(FaceType))
refrenceBook = faceTypes.map({ as FaceType})
extension Results {
    var array: [Element]? {
        return self.count > 0 ? self.map {  } : nil
    }
}

Итак, вы можете использовать как:

Realm().objects(SomeClass.self).filter("someKey ENDSWITH %@", "sth").array

решение Swift 4, Realm 3

extension Results {
    func toArray<T>(ofType: T.Type) -> [T] {
        let array = Array(self) as! [T]
        return array
    }
}

теперь преобразование может быть сделано, как показано ниже

let array = Realm().objects(SomeClass).toArray(ofType: SomeClass.self)

Это еще один способ преобразования Results в массив с расширением с Swift 3 в одну строку.

extension Results {
    func toArray() -> [T] {
        return self.map {  }
    }
}

на Swift 4 и Xcode 9.2

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

Comments

    Ничего не найдено.