如何在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.'
答案 0 :(得分:34)
遗憾的是,不支持基元列表。问题#1120用于跟踪添加对此的支持。你会发现一些想法如何解决当前的问题。
最简单的解决方法是创建一个保存int值的对象。然后模型有一个对象列表。
class Foo: Object {
let integerList = List<IntObject>() // Workaround
}
class IntObject: Object {
dynamic var value = 0
}
答案 1 :(得分:5)
接受的报价在记忆方面非常昂贵。 您可能会得到一个非常大的“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) }
很高兴听到您的反馈,因为我认为这种方法更好。
答案 2 :(得分:1)
正如错误消息所述,您必须使用RLMArray
- 或者更确切地说它是快速等效List
。
请参阅:Realm docs
答案 3 :(得分:1)
幸运的是,Realm 3.0及更高版本现在支持原始类型的数组。 (2017年10月31日)
现在,您可以直接在RLMArrays或List中存储原始类型或它们的可为空的对应类型(更具体地说:布尔值,整数和浮点数类型,字符串,日期和数据)。如果要定义此类原始值的列表,则不再需要定义繁琐的单字段包装对象。相反,您可以只存储原始值!
class MyObject : Object {
@objc dynamic var myString: String = ""
let myIntArray = List<Int>()
}