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

时间:2016-06-06 14:27:44

标签: ios swift firebase 32bit-64bit iphone-64bit

我已将消息存储在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?' */

2 个答案:

答案 0 :(得分:1)

如果您明确指定UInt64Int64(无符号和已签名),则可以明确处理更大的数字,即使在32位设备上也是如此。

答案 1 :(得分:1)

(这回答了编辑过的问题:明确使用Int64类型时出错)

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

即,前者(Int64)自动桥接到Obj-C / Cocoa类类型(Int),而后者(NSNumber无法自然地访问此自动桥接)。

有两种方法可以兑换此

  1. 使用Int64初始值设定项Int64

    明确地执行从NSNumber到等效NSNumber类型的桥接
    init(longLong: <Int64>)

    即,在您的示例中,您可以尝试以下操作:

    let foo: Int64 = 1465222757817
    let bar = NSNumber(longLong: foo)
    
  2. 或者,使用未记录的功能(将来可能会中断):将//... .queryStartingAtValue(NSNumber(longLong: timestampQueryValue)) 符合内部协议Int64,以允许相同的隐式_ObjectiveCBridgeable桥接。对于NSNumber类型。以下主题解释了这个实现:

    在为Int实施此隐式桥接后,您的现有代码应按原样运行,因为Int64的{​​{1}}参数将自动转换为相应的Int64(类)。