Объявить массив 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.

Смотрите: Документы в области