Những gì tôi muốn thực hiện:
class func getSomeObject() -> [SomeObject]? {
let objects = Realm().objects(SomeObject)
return objects.count > 0 ? objects : nil
}
Làm thế nào tôi có thể trả lại đối tượng [SomeObject]thay vì nếu Results?
Những gì tôi muốn thực hiện:
class func getSomeObject() -> [SomeObject]? {
let objects = Realm().objects(SomeObject)
return objects.count > 0 ? objects : nil
}
Làm thế nào tôi có thể trả lại đối tượng [SomeObject]thay vì nếu Results?
Câu trả lời:
Thật kỳ lạ, câu trả lời là rất thẳng về phía trước. Đây là cách tôi làm điều đó:
let array = Array(results) // la fin
Arrayxây dựng với trình lặp kết quả.
Nếu bạn hoàn toàn phải chuyển đổi Resultsthành Array, hãy nhớ rằng có hiệu năng và chi phí bộ nhớ, vì Resultslười biếng. Nhưng bạn có thể làm điều đó trong một dòng, như results.map { $0 }trong swift 2.0 (hoặc map(results) { $0 }trong 1.2).
map { $0 }sẽ trở lại LazyMapRandomAccessCollectiontrong Swift 3, vì vậy câu trả lời @Mazyod là tốt hơn.
Tôi tìm thấy một giải pháp. Tạo phần mở rộng trên Kết quả.
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
}
}
và sử dụng như
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++ nên được thay thế bằngfor i in 0 ..< count
Với Swift 4.2, nó đơn giản như một phần mở rộng:
extension Results {
func toArray() -> [Element] {
return compactMap {
$0
}
}
}
Tất cả các thông tin chung chung cần thiết đã là một phần trong Resultsđó chúng tôi mở rộng.
Đây là một cách khác để chuyển đổi Resultsthành Array với phần mở rộng với Swift 3 trong một dòng duy nhất.
extension Results {
func toArray() -> [T] {
return self.map { $0 }
}
}
Dành cho Swift 4 và Xcode 9.2
extension Results {
func toArray<T>(type: T.Type) -> [T] {
return flatMap { $0 as? T }
}
}
Với Xcode 10 flatMap không dùng nữa, bạn có thể sử dụng compactMapđể ánh xạ.
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
}
}
Sử dụng
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
}
Thay thế: Sử dụng thuốc generic
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
}
Không nên chuyển đổi Kết quả thành Mảng, vì Kết quả là lười biếng. Nhưng nếu bạn cần thử điều này:
func toArray<T>(ofType: T.Type) -> [T] {
return flatMap { $0 as? T }
}
nhưng cách tốt hơn là vượt qua Kết quả bất cứ nơi nào bạn cần. Ngoài ra, bạn có thể chuyển đổi Kết quả thành Danh sách thay vì Mảng.
List(realm.objects(class))
nếu func đầu tiên không hoạt động, bạn có thể thử cái này:
var refrenceBook:[RefrenceProtocol] = []
let faceTypes = Array(realm.objects(FaceType))
refrenceBook = faceTypes.map({$0 as FaceType})
Tôi không chắc chắn, nếu có bất kỳ cách hiệu quả để làm điều này.
Nhưng bạn có thể làm điều đó bằng cách tạo một mảng Swift và nối nó vào vòng lặp.
class func getSomeObject() -> [SomeObject]? {
var someObjects: [SomeObject] = []
let objects = Realm().objects(SomeObject)
for object in objects{
someObjects += [object]
}
return objects.count > 0 ? someObjects : nil
}
Nếu bạn cảm thấy nó quá chậm. Tôi khuyên bạn nên vượt qua xung quanh Resultsđối tượng Realm trực tiếp.
extension Results {
func materialize() -> [Element] {
return Array(self)
}
}