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

Firebase server timestamp and non 64 bit device: Integer literal '...' overflows when stored into 'Int'

我像这样在 Firebase 中存储消息:

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

objects 有一个 child 像: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 类型有。

即,前者 (Int) 自动桥接到 Obj-C/Cocoa class 类型 (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,以允许相同的隐式 NSNumber桥接可用于 Int 类型。以下线程准确解释了此实现:

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