我正在尝试使用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/