回答:
奇妙なことに、答えは非常に簡単です。ここに私がそれをする方法があります:
let array = Array(results) // la fin
Array
ます。上記のコードは、結果イテレーターで構成されたSwiftを返します。
を絶対にに変換する必要がある場合は、遅延が発生するため、パフォーマンスとメモリのオーバーヘッドが発生するResults
ことArray
に注意してくださいResults
。しかしresults.map { $0 }
、Swift 2.0(またはmap(results) { $0 }
1.2)のように、1行で実行できます。
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
Swift 4.2では、拡張機能と同じくらい簡単です。
extension Results {
func toArray() -> [Element] {
return compactMap {
$0
}
}
}
必要なジェネリック情報はすべて、すでにResults
拡張の一部です。
これは、1行Results
でSwift 3を使用して拡張子を付けた配列に変換する別の方法です。
extension Results {
func toArray() -> [T] {
return self.map { $0 }
}
}
用スイフト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
}
遅すぎると感じた場合。Realm Results
オブジェクトを直接渡すことをお勧めします。