Firebase 服务器时间戳和非 64 位设备:整数文字"..."存储到"Int"时溢出



我在Firebase中存储了这样的消息:

messageObject["timestamp"] = FIRServerValue.timestamp()

这些对象有一个子对象,如:timestamp: 1465222757817。问题是较老的非64位设备无法处理该长度的整数。解决这个问题的好办法是什么?

编辑:

当声明时间戳为Int64时,它抛出一个错误:

var timestampQueryValue: Int64 = 1465222757817
self.chatRef.queryOrderedByChild("timestamp")
.queryStartingAtValue(timestampQueryValue)
.observeEventType(.ChildAdded, withBlock: { 
(snapshot) -> Void in /* ... */ })
/* Error: Cannot convert value of type 'Int64' 
to expected argument type 'AnyObject?' */

如果显式指定UInt64Int64(分别为无符号和有符号),即使在32位设备上,也可以显式处理较大的数字。

(这回答了编辑后的问题:显式使用Int64类型时出错)

考虑到您的错误消息,方法.queryStartingAtValue(...)似乎需要类型AnyObject?,这将允许使用可自动(隐式)桥接到AnyObject类型作为参数,这解释了为什么Int类型没有这个问题,而Int64类型有这个问题。

  • 互操作性-使用Cocoa数据类型-数字

即,前者(Int)被自动桥接到Obj-C/Cocoa类类型(NSNumber),而后者(Int64)本机无法访问这种自动桥接。

兑换有两种方法

  1. 使用NSNumber初始值设定项init(longLong: <Int64>)显式执行从Int64到等效NSNumber类型的桥接

    let foo: Int64 = 1465222757817
    let bar = NSNumber(longLong: foo)
    

    也就是说,在您的示例中,您可以尝试以下操作:

    //...
    .queryStartingAtValue(NSNumber(longLong: timestampQueryValue))
    
  2. 或者,使用未记录的功能(将来可能会中断):使Int64符合内部协议_ObjectiveCBridgeable,以允许与Int类型相同的隐式NSNumber桥接。以下线程准确地解释了这个实现:

    • 是否可以为(U)Int8/16/32/64类型复制Swifts自动数值桥接到Foundation(NSNumber)

    Int64实现此隐式桥接后,现有代码应按原样工作,因为.queryStartingAtValue(...)Int64参数将自动转换为适当的NSNumber(类)类型。

最新更新