【问题标题】:Swift convert UInt to IntSwift 将 UInt 转换为 Int
【发布时间】:2014-07-31 10:14:09
【问题描述】:

我有这个表达式,它返回一个UInt32:

let randomLetterNumber = arc4random()%26

我希望能够在这个 if 语句中使用数字:

if letters.count > randomLetterNumber{
    var randomLetter = letters[randomLetterNumber]
}

这个问题是控制台给了我这个

Playground execution failed: error: <REPL>:11:18: error: could not find an overload for '>' that accepts the supplied arguments
if letters.count > randomLetterNumber{
   ~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~

问题是UInt32 无法与Int 进行比较。我想将randomLetterNumber 转换为Int。我试过了:

let randomLetterUNumber : Int = arc4random()%26
let randomLetterUNumber = arc4random()%26 as Int

这些都导致could not find an overload for '%' that accepts the supplied arguments.

如何转换值或在 if 语句中使用它?

【问题讨论】:

    标签: integer swift uint32


    【解决方案1】:

    Int(arc4random_uniform(26)) 做了两件事,一是消除您当前方法的负面结果,二是应该从结果中正确创建一个 Int。

    【讨论】:

    • 谢谢,Int() 初始化程序似乎可以解决问题。
    • 您可以在Apple's Swift docs阅读更多关于数值类型转换的内容。
    • 谢谢。我有一个类似的问题 arc4random_uniform(someArray.count) cast 修复了问题 arc4random_uniform(UInt32(someArray.count))
    • 我遇到了两个问题:probability = Int(arc4random_uniform(UInt32(total))) ... 主要问题是由于标题的提前输入没有关于此方法的信息,也没有提供所需的元数据(然后它将作为解决问题的建议提供)
    【解决方案2】:

    比这更简单,不可能:

    Int(myUInteger)
    

    【讨论】:

    • 这与 OP 的要求完全相反。应该是Int(myUInteger)
    • 这突然开始给我“没有足够的位来表示传递的值”,更具体地说是 Int(arc4random())
    【解决方案3】:

    只需用它创建一个新的 int

    let newRandom: Int = Int(randomLetterNumber)
    if letters.count > newRandom {
        var randomLetter = letters[newRandom]
    }
    

    或者,如果您从不关心 UInt32,您可以创建一个 立即诠释:

    let randomLetterNumber = Int(arc4random() % 26)
    

    【讨论】:

    • 请注意,由于溢出检查,这将在一半时间内抛出异常,请使用我给出的答案来避免这种情况。
    • @David,怎么会这样?不是不同意,只是想明白你的意思。
    • 实际上不会,因为你是在模数之后进行转换,所以你可以保证它总是在界限内。 Int(arc4random()) 将在 32 位平台上执行 50% 的时间崩溃,因为 UInt32 不适合 Int32。刚刚看到太多“arc4random 被窃听并崩溃”的问题。在任何情况下 arc4random_uniform 都会给出更均匀的分布。
    • 使用模运算或除法运算修改/限制随机数分布的输出是不好的形式:它破坏了函数保证的分布属性。相反,请使用 arc4random_uniform(26) 让函数在您指定的范围内保持均匀分布。
    【解决方案4】:

    你可以的

    let u: UInt32 = 0x1234abcd
    let s: Int32 = Int32(bitPattern: u)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-25
      • 2012-08-27
      • 1970-01-01
      • 1970-01-01
      • 2020-11-20
      • 2015-01-23
      • 2017-07-05
      相关资源
      最近更新 更多