在Realm Swift中声明一个Int数组

Vin*_*ino 18 arrays realm ios swift

我怎样才能在里面声明一个整数数组RLMObject

喜欢 :

dynamic var key:[Int]?
Run Code Online (Sandbox Code Playgroud)

给出以下错误:

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.'
Run Code Online (Sandbox Code Playgroud)

kis*_*umi 36

遗憾的是,不支持基元列表.问题#1120跟踪添加对此的支持.你会发现一些想法如何解决当前的问题.

最简单的解决方法是创建一个对象来保存int值.然后模型有一个对象的List.

class Foo: Object {
    let integerList = List<IntObject>() // Workaround
}

class IntObject: Object {
    dynamic var value = 0
}
Run Code Online (Sandbox Code Playgroud)

  • 令人难以置信的是Realm不支持这么简单的事情. (24认同)
  • 从v3.0.0-beta.4开始看起来现在支持它.https://github.com/realm/realm-cocoa/releases/tag/v3.0.0-beta.4 (2认同)
  • @KimiChiu `List&lt;Int&gt;` 应该可以从 v3.0 https://realm.io/blog/realm-cocoa-reaches-3-0/ 开始工作。 (2认同)

Phi*_*tto 7

幸运的是,Realm 3.0 及更高版本现在支持原始类型的数组。(2017 年 10 月 31 日)

您现在可以直接在 RLMArrays 或 Lists 中存储原始类型或其可为 null 的对应物(更具体地说:布尔值、整数和浮点数类型、字符串、日期和数据)。如果要定义此类原始值的列表,则不再需要定义繁琐的单字段包装器对象。相反,您可以自己存储原始值!

class MyObject : Object {
    @objc dynamic var myString: String = ""
    let myIntArray = List<Int>()
}
Run Code Online (Sandbox Code Playgroud)

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


Mat*_*old 5

接受的报价在记忆方面非常昂贵.您可能会获得一个非常大的"n"对象列表.

这不是对与错的问题,但我认为在这里写一个不同的解决方法是件好事.

另一种方法:
我决定用一个字符串来表示一个Int数组.

在我的Realm类中,我定义了一个变量:

dynamic var arrInt: String? = nil
Run Code Online (Sandbox Code Playgroud)

并且非常容易使用它:

let arrToSave = [0, 1, 33, 12232, 394]
<MY_CUSTOM_REALM_CLASS>.arrInt = arrToSave.map { String(describing: $0) }.joined(separator: ",")
Run Code Online (Sandbox Code Playgroud)

回来的路上:

let strFetched = <MY_CUSTOM_REALM_CLASS>.arrInt 
let intArray = strFetched.components(separatedBy: ",").flatMap { Int($0) }
Run Code Online (Sandbox Code Playgroud)

很高兴听到您的反馈,因为我认为这种方法更好.