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
'source' 카테고리의 다른 글
| Windows 의 빌트인 기능만을 사용해 스크립트를 압축 또는 압축 해제하려면 어떻게 해야 합니까? (0) | 2023.04.12 |
|---|---|
| Windows의 Postgresql 구성 파일 'postgresql.conf'는 어디에 있습니까? (0) | 2023.04.12 |
| 클릭 후 WPF 버튼이 강조 표시된 상태로 유지되지 않도록 하려면 어떻게 해야 합니까? (0) | 2023.04.12 |
| 목록에서 무작위로 50개 항목 선택 (0) | 2023.04.12 |
| SQL Server - 트랜잭션 롤백 오류 발생? (0) | 2023.04.07 |