我想要实现的内容:
class func getSomeObject() -> [SomeObject]? {
let objects = Realm().objects(SomeObject)
return objects.count > 0 ? objects : nil
}
Run Code Online (Sandbox Code Playgroud)
[SomeObject]如果相反,我怎样才能返回对象Results?
Maz*_*yod 361
很奇怪,答案非常直截了当.我是这样做的:
let array = Array(results) // la fin
Run Code Online (Sandbox Code Playgroud)
seg*_*ins 30
如果你绝对必须转换你Results的Array,请记住,这是一个性能和内存开销,因为Results是懒惰.但你可以在一行中完成它,如results.map { $0 }swift 2.0(或map(results) { $0 }1.2).
Sah*_*oor 18
我找到了解决方案.在结果上创建扩展.
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
}
}
Run Code Online (Sandbox Code Playgroud)
和使用像
class func getSomeObject() -> [SomeObject]? {
let objects = Realm().objects(SomeObject).toArray(SomeObject) as [SomeObject]
return objects.count > 0 ? objects : nil
}
Run Code Online (Sandbox Code Playgroud)
使用Swift 4.2,它非常简单:
extension Results {
func toArray() -> [Element] {
return compactMap {
$0
}
}
Run Code Online (Sandbox Code Playgroud)
所有必需的泛型信息已经是Results我们扩展的一部分。
斯威夫特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
}
}
Run Code Online (Sandbox Code Playgroud)
用法
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
}
Run Code Online (Sandbox Code Playgroud)
替代方案:使用泛型
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
}
Run Code Online (Sandbox Code Playgroud)
这是在一行中Results使用Swift 3扩展名转换为Array 的另一种方法。
extension Results {
func toArray() -> [T] {
return self.map { $0 }
}
}
Run Code Online (Sandbox Code Playgroud)
对于Swift 4和Xcode 9.2
extension Results {
func toArray<T>(type: T.Type) -> [T] {
return flatMap { $0 as? T }
}
}
Run Code Online (Sandbox Code Playgroud)
不建议使用Xcode 10 flatMap,可以将其compactMap用于映射。
extension Results {
func toArray<T>(type: T.Type) -> [T] {
return compactMap { $0 as? T }
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
61123 次 |
| 最近记录: |