在 Realm Swift 中声明一个 Int 数组

Posted

技术标签:

【中文标题】在 Realm Swift 中声明一个 Int 数组【英文标题】:Declare an array of Int in Realm Swift 【发布时间】:2016-05-15 21:58:30 【问题描述】:

如何在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】:

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

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

class MyObject : Object 
    @objc dynamic var myString: String = ""
    let myIntArray = List<Int>()

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

【讨论】:

不管怎样,如果你选择使用 List 这样的 Primitives,你将无法使用 @count 谓词样式过滤 Results,因为它不受支持Lists of Primitives 。也就是说,将它们包装在 Realm 对象中有其自身的缺点......来自docs.mongodb.com/realm/sdk/ios/examples/filter-data:“评估给定集合中的对象数量。目前仅支持对多关系集合而不支持原语列表。为了在原语列表上使用@count,请考虑将原语包装在 Realm 对象中。”【参考方案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) 

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

【讨论】:

为什么投反对票?我将此答案作为对我有用的提案提出,如果您不喜欢此解决方案,请分享您的想法,不要只是投反对票。 使用description 是一个非常非常糟糕的主意。使用这个:到:let stringOfArray = arrToSave.map String(describing: $0) .joined(separator: ",")。来自:let intArray = stringOfArray.components(separatedBy: ",").flatMap Int($0) 【参考方案3】:

不幸的是,还不支持原语列表。有问题#1120 跟踪添加对此的支持。您会发现一些想法,您可以如何解决当前的问题。

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

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


class IntObject: Object 
    dynamic var value = 0

【讨论】:

Realm 居然不支持这么简单的东西,真是不可思议。 支持还没有实现吗? 还没有。但是Realm核心团队现在正在努力。很快就会得到支持。 现在好像支持了,从 v3.0.0-beta.4 github.com/realm/realm-cocoa/releases/tag/v3.0.0-beta.4 @KimiChiu List&lt;Int&gt; 应该从 v3.0 开始工作 realm.io/blog/realm-cocoa-reaches-3-0 可能你错了。【参考方案4】:

正如错误消息所述,您必须使用 RLMArray - 或者更确切地说,它是 swift 等效的 List

见:Realm docs

【讨论】:

以上是关于在 Realm Swift 中声明一个 Int 数组的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中将 Realm 对象转换为 JSON?

在同一个项目中同时使用 Realm Swift 和 Realm Objective-C

Swift 中 Realm 查询的交叉引用谓词

在 iOS 7 上使用 Realm 和 Swift

在Realm swift中重命名类的最佳方法

在 Realm 中查询(使用 Swift)