我要实现的是:
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
?
Answers:
很奇怪,答案很简单。这是我的方法:
let array = Array(results) // la fin
Array
由结果迭代器构造的Swift 。
如果您绝对必须将转换Results
为Array
,请记住,这Results
是懒惰的,因此会有性能和内存开销。但是您可以像results.map { $0 }
在swift 2.0(或map(results) { $0 }
1.2)中那样一行完成。
map { $0 }
将LazyMapRandomAccessCollection
在Swift 3中返回,因此@Mazyod的答案更好。
我找到了解决方案。在结果上创建了扩展名。
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
这是在单行中Results
使用Swift 3扩展名转换为Array 的另一种方法。
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
}
将结果转换为数组不是一个好主意,因为结果是惰性的。但是,如果您需要尝试此操作:
func toArray<T>(ofType: T.Type) -> [T] {
return flatMap { $0 as? T }
}
但更好的方法是在任何需要的地方传递结果。您也可以将结果转换为列表而不是数组。
List(realm.objects(class))
如果第一个功能不起作用,则可以尝试以下操作:
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 对象。