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
?
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
}
Bizarre, la réponse est très simple. Voici comment je le fais:
let array = Array(results) // la fin
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).
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
}
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 }
}
}
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.
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})
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)
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
.
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