Swift将UInt转换为Int

59

我有这样一个表达式,它会返回一个 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{
   ~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~

问题在于无法将UInt32Int进行比较。我想将randomLetterNumber强制转换为Int。我尝试过:

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

这两个都会导致找不到接受所提供的参数的“%”的重载。

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

4个回答

87

Int(arc4random_uniform(26)) 有两个作用,一是从您当前的方法中消除负面结果,二是应正确地从结果中创建一个 Int。


2
谢谢,Int()初始化程序似乎解决了问题。 - 67cherries
3
您可以在**苹果的 Swift 文档** 中阅读有关数字类型转换的更多信息。 - Nate Cook
7
谢谢。我遇到了与 arc4random_uniform(someArray.count) 相似的问题,使用强制类型转换可以解决问题:arc4random_uniform(UInt32(someArray.count))。 - nacross
我遇到了两个问题:probability = Int(arc4random_uniform(UInt32(total))) … 主要问题是由于头文件,类型提示没有关于此方法的信息,并且没有提供所需的元数据(然后它将作为修复问题的建议提供)。 - bshirley

25

比这更简单,不可能:

Int(myUInteger)

这与 OP 所要求的完全相反。应该是 Int(myUInteger) - 0xKayvan
1
这突然给我返回了"Not enough bits to represent the passed value",更具体地说是Int(arc4random())。 - João Serra

11

只需使用它创建一个新的 int

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

或者如果你不关心UInt32,你可以直接创建一个Int:

let randomLetterNumber = Int(arc4random() % 26)

请注意,由于溢出检查,这将有一半的时间引发异常,请使用我提供的答案来避免此问题。 - David Berry
@David,怎么样?并不是在反驳你,只是想要理解你的意思。 - Firo
1
实际上不会,因为你在取模之后进行强制类型转换,所以可以保证它始终在范围内。在32位平台上执行Int(arc4random())将有50%的概率崩溃,因为UInt32无法适应Int32。我已经看到太多使用Swift的“arc4random存在错误并导致崩溃”的问题了。无论如何,arc4random_uniform将提供更均匀的分布。 - David Berry
1
修改/限制随机数分布的输出,使用取模或除法操作是不好的做法:它破坏了函数所保证的分布特性。相反,使用 arc4random_uniform(26) 让函数在您指定的范围内维持均匀分布。 - cbowns

6
你可以做以下事情。
let u: UInt32 = 0x1234abcd
let s: Int32 = Int32(bitPattern: u)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接