web-dev-qa-db-ja.com

RealmSwift:結果をSwift配列に変換します

私が実装したいもの:

class func getSomeObject() -> [SomeObject]? {
    let objects = Realm().objects(SomeObject)

    return objects.count > 0 ? objects : nil
}

Resultsの場合、代わりに[SomeObject]としてオブジェクトを返すにはどうすればよいですか?

130
Sahil Kapoor

私は解決策を見つけました。結果に拡張機能を作成しました。

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
}
17
Sahil Kapoor

奇妙なことに、答えは非常に単純です。ここに私がそれをする方法があります:

let array = Array(results) // la fin
345
Mazyod

Resultsを絶対にArrayに変換する必要がある場合は、Resultsが遅延しているため、パフォーマンスとメモリのオーバーヘッドがあることに注意してください。ただし、Swift 2.0のresults.map { $0 }(または1.2のmap(results) { $0 })のように、1行で実行できます。

30
segiddins

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
}
6
Jaseem Abbas

これは、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 }
    }
}
5
abdullahselek

Swift 4.2では、次のように簡単です。

extension Results {
  func toArray() -> [Element] {
    return compactMap {
      $0
    }
  }

必要なすべてのジェネリック情報は、すでに拡張したResultsの一部です。

4
NeverwinterMoon

結果が遅延しているため、結果を配列に変換することはお勧めできません。しかし、あなたがこれを試してみる必要がある場合:

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})
3
Nosov Pavel

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)
2
Vinayak

これを行うための効率的な方法があるかどうかはわかりません。

ただし、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オブジェクトを直接渡すことをお勧めします。

2
nRewik
extension Results {
    var array: [Element]? {
        return self.count > 0 ? self.map { $0 } : nil
    }
}

したがって、次のように使用できます。

Realm().objects(SomeClass.self).filter("someKey ENDSWITH %@", "sth").array
2
lindaaak