2016-02-11 6 views
9

Xcode wird über die folgende Zeile beschwert:Ganzzahlliteral überläuft, wenn sie gespeichert in ‚Int‘

let primary = UInt32(0x8BC34AFF) 

Mit dieser Fehlermeldung:

Integer literal '2344831743' overflows when stored into 'Int' 

Ich sehe, dass es eine signierte Integerüberläufe, aber ich absichtlich verwendet UInt32. Meine Frage ist mehr "wie kann das sein" statt "wie kann ich es beheben".

+1

Dieser Fehler kann sehr heimtückisch sein - es auf der Zielplattform abhängig sein kann, so kann Ihr Programm für das iPhone 6 und dann fein kompilieren und ausführen, wenn Sie den Simulator auf dem iPhone 5 ist diese Fehlermeldung erscheint wechseln und verhindert Kompilierung! Glücklicherweise behebt die folgende Antwort das Problem und erklärt den 32-Bit- gegenüber dem 64-Bit-Hintergrund. – RenniePet

Antwort

15

UInt32(0x8BC34AFF) erstellt einen UInt32 durch Aufruf eines Initialisierers. Die UInt32 initializer Sie anrufen, ist:

init(_ v: Int) 

Das Problem ist, dass auf einem 32-Bit-Gerät (iPhone5 und früher), Typ Int 32-Bit. Die über die 0x8BC34AFF übergebene Konstante läuft also über die Int hinaus, die Sie an den Initialisierer UInt32 übergeben.

Die Art und Weise, diese Arbeit sowohl auf 32-Bit- und 64-Bit-Geräte zu haben, die ganze Zahl Literal an den Typen umgewandelt:

let primary = 0x8BC34AFF as UInt32 

Alternativ erklärt die variable UInt32 und nur zuweisen die Konstante zu sein :

let primary:UInt32 = 0x8BC34AFF 
+0

Danke dafür. Mein Code baute und funktionierte gut bis jetzt, als es aus irgendeinem Grund plötzlich nicht in Ordnung war. Ich habe Geräte oder irgendetwas nicht geändert, obwohl dies das erste Mal sein kann, das ich versucht habe, für dieses Gerät mit Xcode 9 zu bauen. – Oded

+1

Ich musste tun '1489064651000 als UInt64' – 3lvis

Verwandte Themen