Ne uygulamak istiyorum:
class func getSomeObject() -> [SomeObject]? {
let objects = Realm().objects(SomeObject)
return objects.count > 0 ? objects : nil
}
[SomeObject]
Bunun yerine nesneyi nasıl döndürebilirim Results
?
Ne uygulamak istiyorum:
class func getSomeObject() -> [SomeObject]? {
let objects = Realm().objects(SomeObject)
return objects.count > 0 ? objects : nil
}
[SomeObject]
Bunun yerine nesneyi nasıl döndürebilirim Results
?
Yanıtlar:
Garip, cevap çok basit. İşte nasıl yaparım:
let array = Array(results) // la fin
Array
, sonuç yineleyici ile oluşturulmuş bir Swift döndürür .
Kesinlikle senin dönüştürmek gerekir Results
için Array
, akılda tutulması beri, bir performans ve bellek havai var Results
tembeldir. Ancak bunu results.map { $0 }
hızlı 2.0'da (veya map(results) { $0 }
1.2'de) olduğu gibi tek bir satırda yapabilirsiniz .
map { $0 }
LazyMapRandomAccessCollection
Swift 3'te geri dönecek , bu yüzden @Mazyod cevabı daha iyi.
Bir çözüm buldum. Sonuçlar üzerinde uzantı oluşturuldu.
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
}
}
ve gibi kullanmak
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++
ile değiştirilmelidirfor i in 0 ..< count
Swift 4.2 ile bir uzantı kadar basit:
extension Results {
func toArray() -> [Element] {
return compactMap {
$0
}
}
}
Gerekli tüm jenerik bilgiler zaten bir kısmını Results
genişlettiğimiz bir bölümdür .
Bu Results
, Swift 3 ile tek bir satırda bir uzantıyla Array'a dönüştürmenin başka bir yoludur .
extension Results {
func toArray() -> [T] {
return self.map { $0 }
}
}
İçin Swift 4 ve Xcode 9.2
extension Results {
func toArray<T>(type: T.Type) -> [T] {
return flatMap { $0 as? T }
}
}
İle Xcode 10 flatMap
kullanımdan kaldırıldı kullanabileceğiniz compactMap
haritalama.
extension Results {
func toArray<T>(type: T.Type) -> [T] {
return compactMap { $0 as? T }
}
}
Hızlı 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
}
}
kullanım
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
}
Alternatif: Jenerik kullanımı
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
}
Sonuçları Diziye dönüştürmek iyi bir fikir değildir, çünkü Sonuçlar tembeldir. Ancak ihtiyacınız varsa bunu deneyin:
func toArray<T>(ofType: T.Type) -> [T] {
return flatMap { $0 as? T }
}
ancak daha iyi bir yol, sonuçları ihtiyacınız olan yere iletmektir. Ayrıca Sonuçları Array yerine Listeye dönüştürebilirsiniz.
List(realm.objects(class))
ilk işlev çalışmıyorsa, bunu deneyebilirsiniz:
var refrenceBook:[RefrenceProtocol] = []
let faceTypes = Array(realm.objects(FaceType))
refrenceBook = faceTypes.map({$0 as FaceType})
Bunu yapmanın etkili bir yolu olup olmadığından emin değilim.
Ancak bunu bir Swift dizisi oluşturarak ve döngüye ekleyerek yapabilirsiniz.
class func getSomeObject() -> [SomeObject]? {
var someObjects: [SomeObject] = []
let objects = Realm().objects(SomeObject)
for object in objects{
someObjects += [object]
}
return objects.count > 0 ? someObjects : nil
}
Çok yavaş olduğunu düşünüyorsanız. Results
Doğrudan Realm nesnesinin etrafından geçmenizi öneririm .
extension Results {
func materialize() -> [Element] {
return Array(self)
}
}