[ios] RealmSwift : 결과를 스위프트 배열로 변환

내가 구현하고 싶은 것 :

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

    return objects.count > 0 ? objects : nil
}

[SomeObject]대신 객체를 어떻게 반환 할 수 Results있습니까?



답변

이상하게도 대답은 매우 간단합니다. 내가하는 방법은 다음과 같습니다.

let array = Array(results) // la fin


답변

당신이 절대적으로 변환해야하는 경우 ResultsArray, 염두에 두어야하기 때문에, 성능 및 메모리 오버 헤드가있다 Results게으른입니다. 그러나 results.map { $0 }swift 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우리가 확장 한 일부입니다 .


답변

이것은 한 줄로 Swift 3Results 확장을 사용하여 Array로 변환하는 또 다른 방법입니다 .

extension Results {
    func toArray() -> [T] {
        return self.map { $0 }
    }
}

대한 스위프트 4 와 엑스 코드 9.2

extension Results {
    func toArray<T>(type: T.Type) -> [T] {
        return flatMap { $0 as? T }
    }
}

엑스 코드 (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 }
}

그러나 더 좋은 방법은 필요할 때마다 결과를 전달하는 것입니다. 또한 Array 대신 Results를 List로 변환 할 수 있습니다.

List(realm.objects(class))

첫 번째 기능이 작동하지 않으면 다음을 시도하십시오.

var refrenceBook:[RefrenceProtocol] = []
let faceTypes = Array(realm.objects(FaceType))
refrenceBook = faceTypes.map({$0 as FaceType})