私が実装したいもの:
class func getSomeObject() -> [SomeObject]? {
let objects = Realm().objects(SomeObject)
return objects.count > 0 ? objects : nil
}
Results
の場合、代わりに[SomeObject]
としてオブジェクトを返すにはどうすればよいですか?
私は解決策を見つけました。結果に拡張機能を作成しました。
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
}
奇妙なことに、答えは非常に単純です。ここに私がそれをする方法があります:
let array = Array(results) // la fin
Results
を絶対にArray
に変換する必要がある場合は、Results
が遅延しているため、パフォーマンスとメモリのオーバーヘッドがあることに注意してください。ただし、Swift 2.0のresults.map { $0 }
(または1.2のmap(results) { $0 }
)のように、1行で実行できます。
Swift
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
を1行でSwiftの拡張子を持つ配列に変換する別の方法です。
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 1flatMap
が廃止されたため、マッピングにcompactMap
を使用できます。
extension Results {
func toArray<T>(type: T.Type) -> [T] {
return compactMap { $0 as? T }
}
}
Swift 4.2では、次のように簡単です。
extension Results {
func toArray() -> [Element] {
return compactMap {
$0
}
}
必要なすべてのジェネリック情報は、すでに拡張した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})
Swift 4、Realmのソリューション
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)
これを行うための効率的な方法があるかどうかはわかりません。
ただし、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
}
遅すぎると感じた場合。 Realm Results
オブジェクトを直接渡すことをお勧めします。
extension Results {
var array: [Element]? {
return self.count > 0 ? self.map { $0 } : nil
}
}
したがって、次のように使用できます。
Realm().objects(SomeClass.self).filter("someKey ENDSWITH %@", "sth").array