2014-08-30 88 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)