O que eu quero implementar:
class func getSomeObject() -> [SomeObject]? {
let objects = Realm().objects(SomeObject)
return objects.count > 0 ? objects : nil
}
Como posso retornar um objeto como [SomeObject]
se Results
?
O que eu quero implementar:
class func getSomeObject() -> [SomeObject]? {
let objects = Realm().objects(SomeObject)
return objects.count > 0 ? objects : nil
}
Como posso retornar um objeto como [SomeObject]
se Results
?
Respostas:
Estranho, a resposta é muito direta. Aqui está como eu faço isso:
let array = Array(results) // la fin
Array
construído com o iterador de resultados.
Se você absolutamente precisa converter o seu Results
para Array
, lembre-se de que há uma sobrecarga de desempenho e memória, pois Results
é preguiçoso. Mas você pode fazer isso em uma linha, como results.map { $0 }
no swift 2.0 (ou map(results) { $0 }
no 1.2).
map { $0 }
retornará LazyMapRandomAccessCollection
no Swift 3, então a resposta do @Mazyod é melhor.
Eu encontrei uma solução. Extensão criada em 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
}
}
e 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++
deve ser substituído porfor i in 0 ..< count
Com o Swift 4.2, é tão simples quanto uma extensão:
extension Results {
func toArray() -> [Element] {
return compactMap {
$0
}
}
}
Todas as informações genéricas necessárias já fazem parte das Results
quais estendemos.
Essa é outra maneira de converter Results
em Array com uma extensão com o Swift 3 em uma única linha.
extension Results {
func toArray() -> [T] {
return self.map { $0 }
}
}
Para Swift 4 e Xcode 9.2
extension Results {
func toArray<T>(type: T.Type) -> [T] {
return flatMap { $0 as? T }
}
}
Com o Xcode 10 flatMap
está obsoleto, você pode usar compactMap
para mapear.
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: Usando 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
}
não é uma boa ideia converter Resultados em Matriz, porque Resultados é preguiçoso. Mas se você precisar, tente o seguinte:
func toArray<T>(ofType: T.Type) -> [T] {
return flatMap { $0 as? T }
}
mas a melhor maneira é passar os Resultados sempre que precisar. Além disso, você pode converter Resultados em Lista em vez de Matriz.
List(realm.objects(class))
se a primeira função não estiver funcionando, você pode tentar esta:
var refrenceBook:[RefrenceProtocol] = []
let faceTypes = Array(realm.objects(FaceType))
refrenceBook = faceTypes.map({$0 as FaceType})
Não tenho certeza, se existe alguma maneira eficiente de fazer isso.
Mas você pode fazer isso criando uma matriz Swift e anexando-a no loop.
class func getSomeObject() -> [SomeObject]? {
var someObjects: [SomeObject] = []
let objects = Realm().objects(SomeObject)
for object in objects{
someObjects += [object]
}
return objects.count > 0 ? someObjects : nil
}
Se você sentir que é muito lento. Eu recomendo que você passe Results
diretamente o objeto Realm .
extension Results {
func materialize() -> [Element] {
return Array(self)
}
}