Что я хочу реализовать:
class func getSomeObject() -> [SomeObject]? {
let objects = Realm().objects(SomeObject)
return objects.count > 0 ? objects : nil
}
Как я могу вернуть объект, как [SomeObject]
если бы Results
?
Что я хочу реализовать:
class func getSomeObject() -> [SomeObject]? {
let objects = Realm().objects(SomeObject)
return objects.count > 0 ? objects : nil
}
Как я могу вернуть объект, как [SomeObject]
если бы Results
?
Ответы:
Странно, ответ очень прямой. Вот как я это делаю:
let array = Array(results) // la fin
Array
созданный с помощью итератора результатов.
Если вам абсолютно необходимо преобразовать его Results
в Array
, имейте в виду, что это Results
связано с производительностью и объемом памяти, так как это лениво. Но вы можете сделать это в одну строку, как results.map { $0 }
в Swift 2.0 (или map(results) { $0 }
в 1.2).
map { $0 }
вернется LazyMapRandomAccessCollection
в Swift 3, так что ответ @Mazyod лучше.
Я нашел решение. Создано расширение по результатам.
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
}
for var i = 0; i < count; i++
следует заменить наfor i in 0 ..< count
С Swift 4.2 это так же просто, как расширение:
extension Results {
func toArray() -> [Element] {
return compactMap {
$0
}
}
}
Вся необходимая общая информация уже является частью, Results
которую мы расширяем.
Это еще один способ преобразования Results
в массив с расширением Swift 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 }
}
}
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
}
не очень хорошая идея конвертировать результаты в массив, потому что результаты ленивы. Но если вам нужно попробовать это:
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 и добавив его в цикл.
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
объект Realm напрямую.
extension Results {
func materialize() -> [Element] {
return Array(self)
}
}