2016-06-06 22 views
1

Ich habe in Firebase gespeicherten Nachrichten wie folgt:Firebase Server Zeitstempel und nicht 64-Bit-Gerät: Ganzzahlliteral ‚...‘ überläuft, wenn sie in ‚Int‘ gespeichert

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

Die Objekte haben ein Kind wie: timestamp: 1465222757817 . Das Problem besteht darin, dass ältere Nicht-64-Bit-Geräte keine Ganzzahlen dieser Länge verarbeiten können. Was wäre eine gute Arbeit für dieses Problem?

Edit:

Wenn der Zeitstempel als Int64 erklärt, wirft er einen Fehler:

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

Check this out: http://stackoverflow.com/questions/2692329/int64-on-a-32-bit-machine – Alexander

Antwort

1

Sie können explizit mit einer größeren Anzahl beschäftigen, auch auf 32-Bit-Geräte, wenn Sie explizit UInt64 angeben oder Int64 (unsigniert bzw. signiert).

+0

Danke, aber leider den Wert Vordergrund Firebase Abfragen ich kann dann nicht verwenden. Siehe aktualisierte Frage. – MJQZ1347

+1

Vielleicht wird erwartet, dass es in eine Instanz von 'NSNumber' gehüllt wird? – Alexander

+1

'NSNumber (longLong: timestampQueryValue)' hat funktioniert, danke! – MJQZ1347

1

(Dies beantwortet die editierte Frage: Fehler bei dem Int64 Typ explizit mit)

Ihrer Fehlermeldung gegeben, wäre es scheint, als ob die Methode .queryStartingAtValue(...)AnyObject? erwartet geben, die als Argument verwendet wird, ermöglicht es, Typen automatisch (implizit) überbrückbar zu AnyObject, was erklärt, warum Sie dieses Problem mit dem Int Typ nicht haben, während Sie mit dem Int64 Typ tun. automatisch auf einen Obj-C/Cocoa Klassentyp überbrückt ist (NSNumber) Diese automatische Überbrückungs

das heißt, die erstere (Int) nicht nativ zugänglich für die letztere (Int64).

ist es zwei Möglichkeiten, diesen

  1. einzulösen Explizit die Überbrückung von Int64 zu der äquivalenten NSNumber Art ausführen, mit dem NSNumber initializer init(longLong: <Int64>)

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

    Ie, in Ihrem Beispiel, könnten Sie versuchen, die folgenden:

    //... 
        .queryStartingAtValue(NSNumber(longLong: timestampQueryValue)) 
    
  2. Oder mit undokumentierten Funktionen (die in der Zukunft brechen könnten): konform Int64 mit dem internen Protokoll _ObjectiveCBridgeable, um die gleiche implizite NSNumber Bridging wie für Int Typ verfügbar zu ermöglichen. Die folgenden Themen erklärt genau diese Implementierung:

    Nachdem diese implizite Überbrückung Implementierung für Int64, Ihre bestehenden Code sollte wie ist die Arbeit, wie das Int64 Argument .queryStartingAtValue(...) wird automatisch in die entsprechende umgewandelt werden NSNumber (Klasse) Typ.