9 ответов:
если вы абсолютно должны конвертировать ваши
ResultsдоArrayимейте в виду, что есть производительность и память, так какResultsленивый. Но вы можете сделать это в одну строку, какresults.map { }в swift 2.0 (илиmap(results) { }в 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 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 }
Я не уверен, если есть какой-либо эффективный способ сделать это.
но вы можете сделать это, создав быстрый массив и добавить его в цикл.
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объект напрямую.
это не очень хорошая идея, чтобы преобразовать результаты в массив, потому что результаты ленивый. Но если вам нужно попробовать это:
func toArray<T>(ofType: T.Type) -> [T] { return flatMap { as? T } }но лучший способ-передать результаты везде, где вам нужно. Также вы можете конвертировать результаты в список вместо массива.
List(realm.objects(class))Если первая функция не работает вы можете попробовать это:
var refrenceBook:[RefrenceProtocol] = [] let faceTypes = Array(realm.objects(FaceType)) refrenceBook = faceTypes.map({ as FaceType})
extension Results { var array: [Element]? { return self.count > 0 ? self.map { } : nil } }Итак, вы можете использовать как:
Realm().objects(SomeClass.self).filter("someKey ENDSWITH %@", "sth").array
решение 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)
Это еще один способ преобразования
Resultsв массив с расширением с Swift 3 в одну строку.extension Results { func toArray() -> [T] { return self.map { } } }на Swift 4 и Xcode 9.2
extension Results { func toArray<T>(type: T.Type) -> [T] { return flatMap { as? T } } }
Comments