내가 구현하고 싶은 것 :
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 }
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})