สิ่งที่ฉันต้องการนำไปใช้:
class func getSomeObject() -> [SomeObject]? {
let objects = Realm().objects(SomeObject)
return objects.count > 0 ? objects : nil
}
ฉันจะกลับมาเป็นวัตถุ[SomeObject]
แทนถ้าResults
?
สิ่งที่ฉันต้องการนำไปใช้:
class func getSomeObject() -> [SomeObject]? {
let objects = Realm().objects(SomeObject)
return objects.count > 0 ? objects : nil
}
ฉันจะกลับมาเป็นวัตถุ[SomeObject]
แทนถ้าResults
?
คำตอบ:
แปลกคำตอบนั้นตรงไปตรงมามาก นี่คือวิธีที่ฉันทำ:
let array = Array(results) // la fin
Array
สร้างขึ้นพร้อมกับ iterator ผลลัพธ์
ถ้าคุณอย่างต้องแปลงของคุณResults
จะArray
เก็บไว้ในใจมีประสิทธิภาพการทำงานและค่าหน่วยความจำตั้งแต่Results
เป็นคนขี้เกียจ แต่คุณสามารถทำได้ในหนึ่งบรรทัดเช่นเดียวกับresults.map { $0 }
ใน swift 2.0 (หรือmap(results) { $0 }
ใน 1.2)
map { $0 }
จะกลับมาเป็นLazyMapRandomAccessCollection
Swift 3 ดังนั้นคำตอบ @ Myazy จะดีกว่า
ฉันพบวิธีแก้ปัญหา สร้างส่วนขยายบนผลลัพธ์
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
}
}
และการใช้งานเช่น
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++
ควรแทนที่ด้วยfor i in 0 ..< count
ด้วย Swift 4.2 มันง่ายเหมือนส่วนขยาย:
extension Results {
func toArray() -> [Element] {
return compactMap {
$0
}
}
}
ข้อมูลทั่วไปที่จำเป็นทั้งหมดเป็นส่วนหนึ่งของResults
เรา
นี่เป็นอีกวิธีหนึ่งในการแปลงResults
เป็น Array ด้วยส่วนขยายด้วยSwift 3ในบรรทัดเดียว
extension Results {
func toArray() -> [T] {
return self.map { $0 }
}
}
สำหรับSwift 4และ Xcode 9.2
extension Results {
func toArray<T>(type: T.Type) -> [T] {
return flatMap { $0 as? T }
}
}
ด้วยXcode 10 flatMap
เลิกใช้แล้วคุณสามารถใช้compactMap
สำหรับการจับคู่
extension Results {
func toArray<T>(type: T.Type) -> [T] {
return compactMap { $0 as? T }
}
}
สวิฟท์ 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
}
}
การใช้
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
}
ทางเลือก: การใช้ยาชื่อสามัญ
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
}
ไม่ใช่ความคิดที่ดีที่จะแปลง Results เป็น Array เพราะ Results เป็นสันหลังยาว แต่ถ้าคุณต้องการลอง:
func toArray<T>(ofType: T.Type) -> [T] {
return flatMap { $0 as? T }
}
แต่วิธีที่ดีกว่าคือการส่งผลลัพธ์ทุกที่ที่คุณต้องการ นอกจากนี้คุณสามารถแปลงผลลัพธ์เป็นรายการแทนที่จะเป็นอาเรย์
List(realm.objects(class))
ถ้า func แรกไม่ทำงานคุณสามารถลองอันนี้:
var refrenceBook:[RefrenceProtocol] = []
let faceTypes = Array(realm.objects(FaceType))
refrenceBook = faceTypes.map({$0 as FaceType})
ฉันไม่แน่ใจว่าหากมีวิธีใดที่มีประสิทธิภาพในการทำเช่นนี้
แต่คุณสามารถทำได้โดยสร้างอาร์เรย์ Swift และผนวกเข้าไปในลูป
class func getSomeObject() -> [SomeObject]? {
var someObjects: [SomeObject] = []
let objects = Realm().objects(SomeObject)
for object in objects{
someObjects += [object]
}
return objects.count > 0 ? someObjects : nil
}
ถ้าคุณรู้สึกว่ามันช้าเกินไป ฉันแนะนำให้คุณส่งต่อResults
วัตถุRealm โดยตรง
extension Results {
var array: [Element]? {
return self.count > 0 ? self.map { $0 } : nil
}
}
ดังนั้นคุณสามารถใช้เช่น:
Realm().objects(SomeClass.self).filter("someKey ENDSWITH %@", "sth").array
โซลูชันสำหรับSwift 4, Realm 3
extension Results {
func toArray<T>(ofType: T.Type) -> [T] {
let array = Array(self) as! [T]
return array
}
}
ตอนนี้การแปลงสามารถทำได้ดังนี้
let array = Realm().objects(SomeClass).toArray(ofType: SomeClass.self)
extension Results {
func materialize() -> [Element] {
return Array(self)
}
}