Was ich implementieren möchte:
class func getSomeObject() -> [SomeObject]? {
let objects = Realm().objects(SomeObject)
return objects.count > 0 ? objects : nil
}
Wie kann ich ein Objekt zurückgeben, als [SomeObject]
ob Results
?
Was ich implementieren möchte:
class func getSomeObject() -> [SomeObject]? {
let objects = Realm().objects(SomeObject)
return objects.count > 0 ? objects : nil
}
Wie kann ich ein Objekt zurückgeben, als [SomeObject]
ob Results
?
Antworten:
Seltsam, die Antwort ist sehr einfach. So mache ich das:
let array = Array(results) // la fin
Array
der mit dem Ergebnisiterator erstellt wurde.
Wenn Sie unbedingt Ihre konvertieren Results
zuArray
denken , dass es einen Leistungs- und Speicheraufwand gibt, da dieser Results
faul ist. Sie können dies jedoch in einer Zeile tun, wie results.map { $0 }
in Swift 2.0 (oder map(results) { $0 }
in 1.2).
map { $0 }
wird LazyMapRandomAccessCollection
in Swift 3 zurückkehren, daher ist die @ Mazyod-Antwort besser.
Ich habe eine Lösung gefunden. Erweiterung für Ergebnisse erstellt.
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
}
}
und mit like
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++
sollte ersetzt werden durchfor i in 0 ..< count
Mit Swift 4.2 ist es so einfach wie eine Erweiterung:
extension Results {
func toArray() -> [Element] {
return compactMap {
$0
}
}
}
Alle benötigten Generika-Informationen sind bereits ein Teil, Results
den wir erweitern.
Dies ist eine weitere Möglichkeit, Results
in Array mit einer Erweiterung mit Swift 3 in einer einzelnen Zeile zu konvertieren .
extension Results {
func toArray() -> [T] {
return self.map { $0 }
}
}
Für Swift 4 und Xcode 9.2
extension Results {
func toArray<T>(type: T.Type) -> [T] {
return flatMap { $0 as? T }
}
}
Mit Xcode 10 flatMap
veraltet ist , können Sie verwenden compactMap
für die Zuordnung.
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
}
}
Verwendung
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: Generika verwenden
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
}
Es ist keine gute Idee, Ergebnisse in Array zu konvertieren, da Ergebnisse faul sind. Aber wenn Sie es brauchen, versuchen Sie Folgendes:
func toArray<T>(ofType: T.Type) -> [T] {
return flatMap { $0 as? T }
}
Besser ist es jedoch, die Ergebnisse überall dort weiterzugeben, wo Sie sie benötigen. Sie können Ergebnisse auch in Liste anstelle von Array konvertieren.
List(realm.objects(class))
Wenn die erste Funktion nicht funktioniert, können Sie diese ausprobieren:
var refrenceBook:[RefrenceProtocol] = []
let faceTypes = Array(realm.objects(FaceType))
refrenceBook = faceTypes.map({$0 as FaceType})
Ich bin mir nicht sicher, ob es dafür einen effizienten Weg gibt.
Sie können dies jedoch tun, indem Sie ein Swift-Array erstellen und es in die Schleife einfügen.
class func getSomeObject() -> [SomeObject]? {
var someObjects: [SomeObject] = []
let objects = Realm().objects(SomeObject)
for object in objects{
someObjects += [object]
}
return objects.count > 0 ? someObjects : nil
}
Wenn Sie das Gefühl haben, dass es zu langsam ist. Ich empfehle Ihnen, das Realm- Results
Objekt direkt weiterzugeben .
extension Results {
func materialize() -> [Element] {
return Array(self)
}
}