1

我在 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?' */
4

2 回答 2

1

UInt64如果您明确指定或Int64(分别为无符号和有符号),您可以显式处理更大的数字,即使在 32 位设备上也是如此。

于 2016-06-06T14:32:00.760 回答
1

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

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

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

有两种方法可以兑换

  1. 使用初始化器显式执行从Int64到等效NSNumber类型的桥接NSNumberinit(longLong: <Int64>)

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

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

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

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

于 2016-06-06T15:11:24.947 回答