我想要实现的是:
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
是惰性加载的。但是在一行中可以这样做:results.map { $0 }
在Swift 2.0中(或者在1.2中使用map(results) { $0 }
)。map { $0 }
将返回LazyMapRandomAccessCollection
,因此@Mazyod的答案更好。 - Legolessextension 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++
should be replaced with for i in 0 ..< count
- Sal使用Swift 4.2只需要一个扩展即可:
extension Results {
func toArray() -> [Element] {
return compactMap {
$0
}
}
}
所有必要的泛型信息已经包含在我们扩展的Results
中。
要使用它:
let someModelResults: Results<SomeModel> = realm.objects(SomeModel.self)
let someModelArray: [SomeModel] = someModelResults.toArray()
这是使用Swift 3中的扩展将Results
转换为数组的另一种方法,可以在一行中完成。
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 }
}
}
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
}
替代方案:使用泛型
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转换为数组不是一个好主意,因为Results是惰性的。但如果您需要尝试这样做:
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 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 {
var array: [Element]? {
return self.count > 0 ? self.map { $0 } : nil
}
}
Realm().objects(SomeClass.self).filter("someKey ENDSWITH %@", "sth").array
我不确定是否有任何高效的方法来做到这一点。
但是你可以通过创建一个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
对象。
Array
。 - Mazyod