2016-08-10 6 views
0

Was etwas zu sein scheint, das ziemlich trivial sein sollte, hat mir ziemlich viele Probleme verursacht. Ich versuche, eine große Ganzzahl vom String in den Int-Typ zu konvertieren. Im Grunde genommen habe ich einen 64-Bit-Hash, der zu einem bestimmten Zeitpunkt als String übergeben wird, und ich muss ihn zurück in einen Int konvertieren.Konvertieren von großen Int von String

Laut aller Dokumentation, die ich finden konnte, in Swift der Int-Typ ist 64Bits. Calling, Int (str) sollte 64bit Conversions gut behandeln. Aber es scheint, dass es versucht, es in eine 32-Bit-Ganzzahl zu konvertieren, so dass ich einen Nullwert erhalte. Ich kann Int64() aus verschiedenen Gründen nicht verwenden (lange Rede kurzer Sinn muss der Schlüssel in meiner Hash-Tabelle vom Typ Int nicht Int64 sein). Hier

ist, was der Code wie folgt aussieht:

zu Beginn der Klasse erklärt:

var nameTable: Dictionary<Int, String> = [:] 

erklärt später in irgendeiner Funktion:

let kv = data[i].componentsSeparatedByString(":") 
self.nameTable[Int(kv[0])!] = kv[1] 

Wo kv[0]="3928953869951869841" und kv[1]="a" das Stück Int(kv([0])! schlägt fehl, weil ein Nil-Wert zurückgegeben wird, wenn es unerwartet war.

Int.max gibt einen Wert von 2147483647, die 32-Bit-Max-Int, die mich als ungerade in Anbetracht aller Docs State Int als 64-Bit-Wert. Code wurde auf iPhones 5 - 6s mit dem gleichen Ergebnis ausgeführt.

Jede Hilfe würde sehr geschätzt werden. Vielen Dank!

+0

es kein Konvertierungsproblem ist wahrscheinlich 'kv [0]' Wert Null –

+0

ist Ich hatte gehofft, dass der Fall war, aber kv Ausdrucken [0] gab mir den Wert, den ich dort platziert – RaiderNation

+0

können Sie tatsächlich teilen Wert? Ist es "" 3928953869951869841 "' –

Antwort

0

Int ("string") - ist optional Typ Wenn Sie null Ausnahme ausschließen möchten, versuchen Sie diesen Code:

let stingNumber = "3928953869951869841" 
    if let index = Int64("\(stingNumber)") { 
     self.nameTable[index] = "a" 
     NSLog("\(self.nameTable)") 
     NSLog("\(Int64.max)") 
    } 

ich dies auf dem iPhone 4s simuliert wurde, und ich log hatte:

2016-08-10 15:22:24.199 stackoverlow-38866748[52907:1401199] [3928953869951869841: "a"] 
2016-08-10 15:22:24.202 stackoverlow-38866748[52907:1401199] 9223372036854775807 
0

Siehe Int in der Apple Developer Dokumentation:

auf 32-Bit Plattformen, Int ist die gleiche Größe wie Int32, und auf 64-Bit-Plattformen Int ist die gleiche Größe wie Int64.

3928953869951869841 überschreitet den Bereich für 32-Bit-Ganzzahlen. Um diesen Wert in einem Integer zu speichern, haben Sie bis Int64 (oder UInt64), es gibt keine Möglichkeit, es (sofern die App nicht auf 64-Bit-Geräte beschränkt ist).

Beachten Sie auch, dass die Dokumentation für hashValue() Zustände:

Hash-Werte nicht in den verschiedenen Ausführungen des Programms, um gleich garantiert. Speichern Sie keine Hashwerte, die bei einer zukünftigen Ausführung verwendet werden sollen.

Verwandte Themen