我已将消息存储在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?' */
答案 0 :(得分:1)
如果您明确指定UInt64
或Int64
(无符号和已签名),则可以明确处理更大的数字,即使在32位设备上也是如此。
答案 1 :(得分:1)
(这回答了编辑过的问题:明确使用Int64
类型时出错)
鉴于您的错误消息,似乎方法.queryStartingAtValue(...)
需要类型AnyObject?
,这将允许使用类型作为参数自动(隐式)桥接到{{1} } ,这解释了为什么你没有AnyObject
类型的这个问题,而你使用Int
类型。
即,前者(Int64
)自动桥接到Obj-C / Cocoa类类型(Int
),而后者(NSNumber
无法自然地访问此自动桥接)。
有两种方法可以兑换此
使用Int64
初始值设定项Int64
NSNumber
到等效NSNumber
类型的桥接
init(longLong: <Int64>)
即,在您的示例中,您可以尝试以下操作:
let foo: Int64 = 1465222757817
let bar = NSNumber(longLong: foo)
或者,使用未记录的功能(将来可能会中断):将//...
.queryStartingAtValue(NSNumber(longLong: timestampQueryValue))
符合内部协议Int64
,以允许相同的隐式_ObjectiveCBridgeable
桥接。对于NSNumber
类型。以下主题解释了这个实现:
在为Int
实施此隐式桥接后,您的现有代码应按原样运行,因为Int64
的{{1}}参数将自动转换为相应的Int64
(类)。