web-dev-qa-db-fra.com

RealmSwift: Convertir les résultats en Swift Array

Ce que je veux implémenter:

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

    return objects.count > 0 ? objects : nil
}

Comment puis-je retourner un objet sous la forme [SomeObject] à la place si Results?

131
Sahil Kapoor

J'ai trouvé une solution. Extension créée sur les résultats.

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

et en utilisant comme

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

    return objects.count > 0 ? objects : nil
}
17
Sahil Kapoor

Bizarre, la réponse est très simple. Voici comment je le fais:

let array = Array(results) // la fin
353
Mazyod

Si vous devez absolument convertir votre Results en Array, gardez à l'esprit qu'il existe un surcoût de performance et de mémoire, puisque Results est paresseux. Mais vous pouvez le faire en une seule ligne, comme results.map { $0 } dans Swift 2.0 (ou map(results) { $0 } dans 1.2).

30
segiddins

Swift

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

tilisation

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
}

Alternative: Utilisation de génériques

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
}
6
Jaseem Abbas

Ceci est une autre façon de convertir Results en tableau avec une extension avec Swift sur une seule ligne.

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

Pour Swift 4 et Xcode 9.2

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

Lorsque Xcode 1flatMap est obsolète, vous pouvez utiliser compactMap pour le mappage.

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

Avec Swift 4.2, c'est aussi simple que:

extension Results {
  func toArray() -> [Element] {
    return compactMap {
      $0
    }
  }

Toutes les informations génériques nécessaires font déjà partie de Results que nous étendons.

4
NeverwinterMoon

ce n'est pas une bonne idée de convertir Results en Array, car Results est paresseux. Mais si vous avez besoin d'essayer ceci:

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

mais le meilleur moyen est de passer des résultats partout où vous avez besoin. Vous pouvez également convertir les résultats en liste au lieu de tableau.

List(realm.objects(class))

si le premier func ne fonctionne pas, vous pouvez essayer celui-ci:

var refrenceBook:[RefrenceProtocol] = []
let faceTypes = Array(realm.objects(FaceType))
refrenceBook = faceTypes.map({$0 as FaceType})
4
Nosov Pavel

Solution pour Swift 4, Royaume

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

Maintenant, la conversion peut être faite comme ci-dessous

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

Je ne sais pas s'il existe un moyen efficace de le faire.

Mais vous pouvez le faire en créant un tableau Swift et en l'ajoutant à la boucle.

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

Si vous sentez que c'est trop lent. Je vous recommande de passer directement à l'objet Realm Results.

2
nRewik
extension Results {
    var array: [Element]? {
        return self.count > 0 ? self.map { $0 } : nil
    }
}

Donc, vous pouvez utiliser comme:

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