2014-08-30 21 views
39

Ich mache einen Tcp-Client und daher die CFStreamCreatePairWithSocketToHost, die einen UInt32 für den zweiten Parameter erwartet. HierKonvertieren von Int in UInt32 in Swift

ist eine Probe von dem, was ich versuche zu tun zu .:

func initNetwork(IP: String, Port: Int) { 
    // relevant stuff 

    //Convert Port:Int to UInt32 to make this shit work! 

    CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault, IP as NSString , Port , &readStream, &writeStream) 

    // Irelevant stuff 
} 

Ich habe mich um eine Lösung für einige Zeit, und ich kann nicht ein scheinen zu finden!

Antwort

79

Sie können es leicht tun:

var x = UInt32(yourInt) 
+12

Es ist Gießen nicht. UInt stellt einen Initialisierer bereit, der Int akzeptiert. – akashivskyy

5

Es ist sehr einfach:

let int: Int = 40 
let uint = UInt32(i) 

in Ihrem Fall passieren nur

UInt32(Port) 

Für einen Port ist kein Problem, aber in anderen Fällen müssen Sie kümmern Überlauf nehmen

Seitennotiz: In swift ist es eine gute Übung, Variablen mit einem niedrigeren Kamel zu benennen, also mit dem ersten Buchstaben in Kleinbuchstaben

11

Nikos M.'s answer Macht Überlauf, weil Swift Int s 64 Bit jetzt, und Swift wird abstürzen, wenn die Standard UInt32 initializer überläuft. Wenn Sie einen Überlauf vermeiden möchten, verwenden Sie the truncatingBitPattern initializer.

Wenn Sie sicher sind, dass Ihre Daten nicht überlaufen, sollten Sie den Standardinitialisierer verwenden, da ein Überlauf ungültige Daten für Ihre Anwendung darstellt. Wenn Sie sicher sind, dass Ihre Daten überlaufen, Sie aber nicht an der Kürzung interessiert sind (wie wenn Sie Hash-Werte oder Ähnliches erstellen), dann möchten Sie wahrscheinlich abschneiden.

let myInt: Int = 576460752303423504 
let myUInt32 = UInt32(truncatingBitPattern: myInt) 
+2

Ich stimme nicht zu. Dies ändert die Daten stillschweigend. Das Auslösen einer expliziten Panik aufgrund eines Bereichs außerhalb des Bereichs ist besser als das Vortäuschen, dass ein anderer Wert übergeben wurde. Swift verwendet standardmäßig einen Panic-On-Overflow. –

+1

Fair genug. Ich werde die Antwort aktualisieren. –

+3

Was ist der beste Weg zu testen, ob der Eingangswert einen Überlauf auslöst? 'if myInt> Int (UInt32.max) {...}'? 'if myInt == Int (UInt32 (truncatingBitPattern: myInt)) {...}'? – Klaas

5

Noch einfacher: (Sie fragen sich, warum sie die unsigned func verwenden)

var x = Int32(yourInt)