【问题标题】:Convert Int to UInt32 in Swift在 Swift 中将 Int 转换为 UInt32
【发布时间】:2014-10-24 03:43:34
【问题描述】:

我正在创建一个 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
}

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

【问题讨论】:

    标签: swift type-conversion


    【解决方案1】:

    你可以轻松做到:

    var x = UInt32(yourInt)
    

    【讨论】:

    • 这不是强制转换。 UInt 提供了一个接受 Int 的初始化器。
    • 请注意,如果值对于 UInt32 而言太大,这将触发陷阱并导致程序崩溃。更安全地使用UInt32(truncatingIfNeeded:),如下所示。
    • 令人烦恼的是,这个初始化程序没有出现在 Xcode 自动完成中。 Uint32(bigEndian: 等的选项,但不适用于没有任何标签的函数。
    【解决方案2】:

    Nikos M.'s answer 可能会溢出,因为 Swift Ints 现在是 64 位的,当默认的 UInt32 初始化程序溢出时 Swift 会崩溃。如果要避免溢出,请使用the truncatingBitPattern initializer

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

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

    【讨论】:

    • 我不同意。这是在默默地改变数据。由于超出范围的端口而触发显式恐慌比假装传递了不同的值要好。 Swift 默认为 panic-on-overflow 是有原因的。
    • 如果输入值会触发溢出,最好的测试方法是什么? if myInt > Int(UInt32.max) { ... }? if myInt == Int(UInt32(truncatingBitPattern: myInt)) { ... }?
    【解决方案3】:

    很简单:

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

    在你的情况下,只需通过

    UInt32(Port)
    

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

    旁注:在 swift 中,最好使用小写驼峰式命名变量,因此第一个字母小写

    【讨论】:

      【解决方案4】:

      更容易:(想知道他们为什么使用无符号函数)

      var x = Int32(yourInt) 
      

      【讨论】:

      • 这实际上与接受的答案完全相同,希望您使用 Int32 而不是 OP 明确要求的 UInt32
      猜你喜欢
      • 2017-10-15
      • 2016-02-17
      • 1970-01-01
      • 2016-07-20
      • 2015-10-03
      • 1970-01-01
      • 2017-03-11
      • 2022-11-01
      • 2014-07-24
      相关资源
      最近更新 更多