RealmSwift:将结果转换为Swift数组
我想要实现的是:
class func getSomeObject() -> [SomeObject]? { let objects = Realm().objects(SomeObject) return objects.count > 0 ? objects : nil }
如果返回对象作为[SomeObject]
而不是Results
?
奇怪的是,答案非常简单。 下面是我如何做到这一点:
let array = Array(results) // la fin
如果您绝对必须将您的Results
转换为Array
,请记住,由于Results
是懒惰的,因此存在性能和内存开销。 但是你可以在一行中做到,就像swift 2.0中的results.map { $0 }
(或者1.2中的map(results) { $0 }
)。
我find了解决scheme。 在结果上创build扩展。
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 }
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 } }
用法
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 }
另类:使用generics
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 }
我不确定,如果有任何有效的方法来做到这一点。
但你可以通过创build一个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 }
如果你觉得太慢了。 我build议你直接传递Realm 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})