在Realm Swift中声明一个Int数组

时间:2016-02-05 19:51:02

标签: ios arrays swift realm

如何在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.'

4 个答案:

答案 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>()
}

来源:https://realm.io/blog/realm-cocoa-reaches-3-0/