Co chcę wdrożyć:
class func getSomeObject() -> [SomeObject]? {
let objects = Realm().objects(SomeObject)
return objects.count > 0 ? objects : nil
}
Jak mogę zwrócić obiekt, jakby [SomeObject]
zamiast tego Results
?
Co chcę wdrożyć:
class func getSomeObject() -> [SomeObject]? {
let objects = Realm().objects(SomeObject)
return objects.count > 0 ? objects : nil
}
Jak mogę zwrócić obiekt, jakby [SomeObject]
zamiast tego Results
?
Odpowiedzi:
Dziwne, odpowiedź jest bardzo prosta. Oto jak to robię:
let array = Array(results) // la fin
Array
skonstruowany z iteratorem wyników.
Jeśli absolutnie musisz przekonwertować swój program Results
na Array
, pamiętaj, że istnieje narzut wydajności i pamięci, ponieważ Results
jest leniwy. Ale możesz to zrobić w jednej linii, jak results.map { $0 }
w swift 2.0 (lub map(results) { $0 }
w 1.2).
map { $0 }
powróci LazyMapRandomAccessCollection
w Swift 3, więc odpowiedź @Mazyod jest lepsza.
Znalazłem rozwiązanie. Utworzono rozszerzenie w wynikach.
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
}
}
i używając 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++
należy zastąpićfor i in 0 ..< count
Dzięki Swift 4.2 jest to tak proste, jak rozszerzenie:
extension Results {
func toArray() -> [Element] {
return compactMap {
$0
}
}
}
Wszystkie potrzebne informacje ogólne są już częścią, Results
którą rozszerzamy.
To kolejny sposób na konwersję Results
do Array z rozszerzeniem z Swift 3 w jednej linii.
extension Results {
func toArray() -> [T] {
return self.map { $0 }
}
}
Dla Swift 4 i Xcode 9.2
extension Results {
func toArray<T>(type: T.Type) -> [T] {
return flatMap { $0 as? T }
}
}
Z Xcode 10 flatMap
jest przestarzały, możesz go używać compactMap
do mapowania.
extension Results {
func toArray<T>(type: T.Type) -> [T] {
return compactMap { $0 as? T }
}
}
Szybki 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
}
}
Stosowanie
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
}
Alternatywa: używanie typów ogólnych
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
}
nie jest dobrym pomysłem konwertowanie wyników na tablicę, ponieważ wyniki są leniwe. Ale jeśli potrzebujesz, spróbuj tego:
func toArray<T>(ofType: T.Type) -> [T] {
return flatMap { $0 as? T }
}
ale lepszym sposobem jest przekazywanie wyników w dowolnym miejscu. Możesz także przekonwertować wyniki na listę zamiast na tablicę.
List(realm.objects(class))
jeśli pierwsza funkcja nie działa, możesz wypróbować tę:
var refrenceBook:[RefrenceProtocol] = []
let faceTypes = Array(realm.objects(FaceType))
refrenceBook = faceTypes.map({$0 as FaceType})
Nie jestem pewien, czy istnieje jakiś skuteczny sposób, aby to zrobić.
Ale możesz to zrobić, tworząc tablicę Swift i dołączając ją w pętli.
class func getSomeObject() -> [SomeObject]? {
var someObjects: [SomeObject] = []
let objects = Realm().objects(SomeObject)
for object in objects{
someObjects += [object]
}
return objects.count > 0 ? someObjects : nil
}
Jeśli uważasz, że jest za wolno. Polecam ci Results
bezpośrednio ominąć obiekt Realm .
extension Results {
func materialize() -> [Element] {
return Array(self)
}
}