2014-08-30 16 views
39

Tworzę klienta Tcp i dlatego używam CFStreamCreatePairWithSocketToHost, który oczekuje UInt32 dla drugiego parametru.Konwertuj Int do UInt32 w Swift

Oto próbka tego, co próbuję zrobić .:

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 
} 

czekałem wokół rozwiązania przez jakiś czas, a ja nie mogę znaleźć jednego!

Odpowiedz

79

Można to zrobić w prosty sposób:

var x = UInt32(yourInt) 
+12

To nie odlewania. UInt dostarcza inicjator, który akceptuje Int. – akashivskyy

5

To bardzo proste:

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

w Twoim przypadku, po prostu przekazać

UInt32(Port) 

Do portu nie jest problemem, ale w innych przypadkach należy zadbać o przepełnienie

Notatka boczna: w szybkim tempie dobrze jest nazwać zmienne za pomocą niższego wielbłąda, więc pierwszą literą należy wpisać małą literą:

11

Nikos M.'s answer może przepełnienie ponieważ Swift Int s są teraz 64-bitowy, a Swift padnie gdy domyślne przepełnienia UInt32 initializer. Jeśli chcesz uniknąć przepełnienia, użyj the truncatingBitPattern initializer.

Jeśli masz pewność, że Twoje dane nie zostaną przepełnione, powinieneś użyć domyślnego inicjalizatora, ponieważ przepełnienie reprezentuje nieprawidłowe dane dla Twojej aplikacji. Jeśli masz pewność, że Twoje dane zostaną przepełnione, ale nie obchodzi cię obcięcie (np. Jeśli budujesz wartości mieszania lub coś takiego), prawdopodobnie chcesz je skrócić.

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

Nie zgadzam się. To cicho zmienia dane. Wywołanie jawnej paniki ze względu na port spoza zakresu jest lepsze niż udawanie, że przekazano inną wartość. Swift domyślnie nie ma powodu do paniki przy przepełnieniu. –

+1

Wystarczająco fair. Zaktualizuję odpowiedź. –

+3

Jaki jest najlepszy sposób sprawdzenia, czy wartość wejściowa spowoduje wyładowanie? 'if myInt> Int (UInt32.max) {...}'? 'if myInt == Int (UInt32 (truncatingBitPattern: myInt)) {...}'? – Klaas

5

Jeszcze łatwiejsze: (Zastanawiasz się dlaczego oni używać unsigned func)

var x = Int32(yourInt)