Объявить массив Int в Realm Swift
Как объявить массив целых чисел внутри RLMObject
?
Вроде:
dynamic var key:[Int]?
Дает следующую ошибку:
Terminating app due to uncaught exception 'RLMException', reason: ''NSArray' is not supported as an RLMObject property. All properties must be primitives, NSString, NSDate, NSData, RLMArray, or subclasses of RLMObject. See https://realm.io/docs/objc/latest/api/Classes/RLMObject.html for more information.'
Ответы
Ответ 1
Списки примитивов пока не поддерживаются, к сожалению. Существует проблема # 1120, чтобы отслеживать добавление поддержки для этого. Вы найдете там некоторые идеи, как вы можете обходить это в настоящее время.
Простейшим обходным решением является создание объекта для хранения значений int. Затем модель должна иметь список объектов.
class Foo: Object {
let integerList = List<IntObject>() // Workaround
}
class IntObject: Object {
dynamic var value = 0
}
Ответ 2
Принятое предложение является очень дорогостоящим с точки зрения памяти.
Вы можете получить список очень больших "n" объектов.
Это не вопрос правильного и неправильного, но я думаю, что хорошо писать здесь другое обходное решение.
Другой подход:
Я решил использовать одну строку для представления массива Int.
В моем классе Realm я определил переменную:
dynamic var arrInt: String? = nil
И используйте его очень легко:
let arrToSave = [0, 1, 33, 12232, 394]
<MY_CUSTOM_REALM_CLASS>.arrInt = arrToSave.map { String(describing: $0) }.joined(separator: ",")
И обратно:
let strFetched = <MY_CUSTOM_REALM_CLASS>.arrInt
let intArray = strFetched.components(separatedBy: ",").flatMap { Int($0) }
Будем рады услышать ваши отзывы, так как я думаю, что этот подход лучше.
Ответ 3
Как указано в сообщении об ошибке, вы должны использовать RLMArray
- или, скорее, быстрый эквивалент List
.
Смотрите: Документы в области