source

Realm Swift: 결과를 Swift Array로 변환

itover 2023. 4. 12. 22:16
반응형

Realm Swift: 결과를 Swift Array로 변환

구현 대상:

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 }2.0(또는map(results) { $0 }(1.2)에 기재되어 있습니다.

해결책을 찾았어요결과에서 확장을 생성했습니다.

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
}

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()

이것은 다른 변환 방법 중 하나입니다.ResultsSwift 3을 한 줄로 확장한 어레이로 변환합니다.

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 }
    }
}

스위프트 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 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)

효율적인 방법이 없을지 모르겠네요.

그러나 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직접 반대하다

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

다음과 같이 사용할 수 있습니다.

Realm().objects(SomeClass.self).filter("someKey ENDSWITH %@", "sth").array
extension Results {
    func materialize() -> [Element] {
        return Array(self)
    }
}

Swift 5 및 RealmSwift v10.20.0 사용

이 방법은 다음과 같습니다.

private func convertToArray<R>(results: Results<R>) -> [R] where R: Object {
    var arrayOfResults: [R] = []
    for result in results {
        arrayOfResults.append(result)
    }
    return arrayOfResults
}

언급URL : https://stackoverflow.com/questions/31100011/realmswift-convert-results-to-swift-array

반응형