【问题标题】:Declare an array of Int in Realm Swift在 Realm Swift 中声明一个 Int 数组
【发布时间】: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.'

【问题讨论】:

    标签: ios arrays swift realm


    【解决方案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
    }
    

    【讨论】:

    【解决方案4】:

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

    见:Realm docs

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-30
      • 1970-01-01
      • 1970-01-01
      • 2018-10-06
      • 2020-03-04
      • 2014-12-31
      • 2012-04-08
      • 2020-05-30
      相关资源
      最近更新 更多