在Swift中将Int转换为UInt32

Mad*_*erg 44 type-conversion swift

我正在创建一个Tcp客户端,因此使用CFStreamCreatePairWithSocketToHost期望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
}
Run Code Online (Sandbox Code Playgroud)

我一直在寻找一段时间的解决方案,我似乎找不到一个!

Nik*_* M. 89

你可以轻松地做到:

var x = UInt32(yourInt)
Run Code Online (Sandbox Code Playgroud)

  • 它不是铸造.UInt提供了一个接受Int的初始化程序. (13认同)

Hea*_*ers 17

Nikos M.的答案可能会溢出,因为Swift Int现在是64位,当默认的UInt32初始化程序溢出时,Swift会崩溃.如果你想避免溢出,使用truncatingBitPattern初始化.

如果您确定数据不会溢出,则应使用默认初始值设定项,因为溢出表示应用程序的无效数据.如果您确定您的数据会溢出,但您不关心截断(例如,如果您正在构建哈希值或其他内容),那么您可能希望截断.

let myInt: Int = 576460752303423504
let myUInt32 = UInt32(truncatingBitPattern: myInt)
Run Code Online (Sandbox Code Playgroud)

  • 如果输入值会触发溢出,最好的测试方法是什么?`if myInt> Int(UInt32.max){...}`?`if myInt == Int(UInt32(truncatingBitPattern:myInt)){...}`? (4认同)
  • 我不同意.这是默默地改变数据.由于超出范围的端口而触发显式的恐慌比假装传递不同的值更好.由于某种原因,Swift默认为溢出时出现恐慌. (2认同)

Ant*_*nio 6

这很简单:

let int: Int = 40
let uint = UInt32(i)
Run Code Online (Sandbox Code Playgroud)

在你的情况下,只是通过

UInt32(Port)
Run Code Online (Sandbox Code Playgroud)

对于端口不是问题,但在其他情况下一定要注意溢出

旁注:在swift中,使用较低的驼峰案例命名变量是一种好习惯,因此第一个字母为小写


Thi*_*iru 5

更容易:(想知道为什么他们使用unsigned func)

var x = Int32(yourInt) 
Run Code Online (Sandbox Code Playgroud)