2014-08-30 87 views
39

我正在製作一個Tcp客戶端,因此使用期望UInt32作爲第二個參數的CFStreamCreatePairWithSocketToHost在Swift中將Int轉換爲UInt32

這裏是我想要做的:

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 
} 

我一直在四處尋找了一段時間的解決方案的樣品,我似乎無法找到一個!

回答

79

您可以輕鬆地做到這一點:

var x = UInt32(yourInt) 
+12

這不是鑄造。 UInt提供了一個接受Int的初始化器。 – akashivskyy 2014-08-30 09:08:53

5

這很簡單:

let int: Int = 40 
let uint = UInt32(i) 
你的情況

,只是通過

UInt32(Port) 

對於一個端口是沒有問題的,但在其他情況下,一定要採取溢出的照顧

注意事項:在swift中,使用較小的駱駝情況命名變量是一種很好的做法,所以第一個字母爲小寫字母

11

Nikos M.'s answer似溢,因爲斯威夫特Int s爲64位,現在,斯威夫特會崩潰的時候默認UInt32的初始化溢出。如果您想避免溢出,請使用the truncatingBitPattern initializer

如果您確定數據不會溢出,那麼您應該使用默認初始化程序,因爲溢出表示應用程序的無效數據。如果你確定你的數據會溢出,但你不關心截斷(就像你正在構建哈希值或其他東西),那麼你可能想要截斷。

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

我不同意。這是默默地改變數據。由於超出範圍的端口觸發明確的恐慌比假裝通過不同的值更好。由於某種原因,Swift默認會出現panic-on-overflow。 – 2015-05-28 20:58:20

+1

夠公平的。我會更新答案。 – 2015-05-29 19:40:21

+3

如果輸入值會觸發溢出,最好的測試方法是什麼? 'if myInt> Int(UInt32.max){...}'? 'if myInt == Int(UInt32(truncatingBitPattern:myInt)){...}'? – Klaas 2016-09-14 21:28:39

5

仍然更容易:(不知道他們爲什麼使用無符號FUNC)

var x = Int32(yourInt)