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