我正在尝试使用arc4random和%运算符计算两个限制在特定范围内的随机数。
我无法理解为什么编译器在计算(x1,y1)时会抱怨,因为除了直接使用int文本外,x2,y2几乎做了相同的事情。
有什么想法吗?
代码示例是:

import Darwin

let w1:Int = 223

// error: Could not find an overload for '%' that accepts the supplied arguments
let (x1,y1) =
(
  arc4random() % w1,
  arc4random() % 345
)




let (x2,y2) =
(
  arc4random() % 223,
  arc4random() % 345
)

最佳答案

那是因为斯威夫特强制执行类型安全。
arc4random()返回UInt32,而您已将w声明为Int,因此将引发编译器错误。如果您试图对w和调用arc4random()的结果进行求和或除法,则也会发生这种情况,因此该行为并不排斥余数运算符。
您有几个选项,具体取决于您打算如何使用操作的结果值。
您可以首先将w1声明为UInt32

var w1: UInt32 = 223

或者,可以在执行剩余操作之前将其强制转换为UInt32
arc4random() % UInt32(w1)

最后,您可以从Int调用的结果初始化arc4random(),并将其与Int版本的w1一起使用
Int(arc4random()) % w1

请注意,此行为不适用于文字。
从苹果提供的iBook:
组合数值常量和变量的规则是不同的
从数字文本的规则。可以添加文字值3
直接到文本值0.14159,因为数字文本不
有自己明确的类型。他们的类型是推断出来的
只有在编译器对它们求值的时候。
这就是为什么在执行arc4random() % 345时不会出现相同的问题。

关于swift - 对Swift中的余数运算符的行为感到困惑,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24060640/

10-12 14:30