Lo que quiero implementar:
class func getSomeObject() -> [SomeObject]? {
let objects = Realm().objects(SomeObject)
return objects.count > 0 ? objects : nil
}
¿Cómo puedo devolver un objeto como [SomeObject]
si en su lugar Results
?
Lo que quiero implementar:
class func getSomeObject() -> [SomeObject]? {
let objects = Realm().objects(SomeObject)
return objects.count > 0 ? objects : nil
}
¿Cómo puedo devolver un objeto como [SomeObject]
si en su lugar Results
?
Respuestas:
Extraño, la respuesta es muy sencilla. Así es como lo hago:
let array = Array(results) // la fin
Array
construido con el iterador de resultados.
Si es absolutamente necesario convertir Results
a Array
, tenga en cuenta que hay una sobrecarga de rendimiento y la memoria, ya que Results
es perezoso. Pero puede hacerlo en una línea, como results.map { $0 }
en swift 2.0 (o map(results) { $0 }
en 1.2).
map { $0 }
regresará LazyMapRandomAccessCollection
en Swift 3, por lo que la respuesta de @Mazyod es mejor.
Encontré una solución. Extensión creada en los resultados.
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
}
}
y usando como
class func getSomeObject() -> [SomeObject]? {
let objects = Realm().objects(SomeObject).toArray(SomeObject) as [SomeObject]
return objects.count > 0 ? objects : nil
}
for var i = 0; i < count; i++
debe ser reemplazado confor i in 0 ..< count
Con Swift 4.2 es tan simple como una extensión:
extension Results {
func toArray() -> [Element] {
return compactMap {
$0
}
}
}
Toda la información genérica necesaria ya es parte de la Results
cual ampliamos.
Esta es otra forma de convertir Results
en Array con una extensión con Swift 3 en una sola línea.
extension Results {
func toArray() -> [T] {
return self.map { $0 }
}
}
Para Swift 4 y Xcode 9.2
extension Results {
func toArray<T>(type: T.Type) -> [T] {
return flatMap { $0 as? T }
}
}
Con Xcode 10 flatMap
está en desuso, puede usarlo compactMap
para el mapeo.
extension Results {
func toArray<T>(type: T.Type) -> [T] {
return compactMap { $0 as? T }
}
}
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
}
}
Uso
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
}
Alternativa: uso de genéricos
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
}
no es una buena idea convertir Results a Array, porque Results es vago. Pero si necesitas probar esto:
func toArray<T>(ofType: T.Type) -> [T] {
return flatMap { $0 as? T }
}
pero la mejor manera es pasar resultados donde lo necesite. También puede convertir Resultados a Lista en lugar de Array.
List(realm.objects(class))
Si el primer func no funciona, puede probar este:
var refrenceBook:[RefrenceProtocol] = []
let faceTypes = Array(realm.objects(FaceType))
refrenceBook = faceTypes.map({$0 as FaceType})
No estoy seguro, si hay alguna manera eficiente de hacer esto.
Pero puede hacerlo creando una matriz Swift y anexándola en el bucle.
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 sientes que es demasiado lento. Te recomiendo que pases el Results
objeto Realm directamente.
extension Results {
func materialize() -> [Element] {
return Array(self)
}
}