我正在尝试使用arc4random和%运算符计算约束到特定范围的两个随机数。
我无法弄清楚为什么编译器在计算(x1,y1)时抱怨为什么x2,y2几乎完全相同的事情,除了直接使用int文字。
有什么想法吗?
代码示例是:
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
)
答案 0 :(得分:2)
这是由于Swift强制执行类型安全。
arc4random()
返回UInt32
,而您已将w
声明为Int
,因此会引发编译错误。如果您尝试对w
求和或除以调用arc4random()
的结果,那也会发生这种情况,因此该行为不是余数运算符所独有的。
您有几个选项,具体取决于您打算如何使用操作的结果值。
您可以首先将w1声明为UInt32
:
var w1: UInt32 = 223
或者,您可以在执行余数操作之前将其强制转换为UInt32
:
arc4random() % UInt32(w1)
最后,您可以从Int
调用的结果中初始化arc4random()
,并将其与w1
的Int版本一起使用
Int(arc4random()) % w1
请注意,此行为不适用于文字。
来自Apple提供的iBook:
组合数字常量和变量的规则是不同的 来自数字文字的规则。可以添加文字值3 直接到字面值0.14159,因为数字文字没有 有一个明确的类型和他们自己。他们的类型是推断的 仅在编译器评估它们时。
这就是为什么在执行arc4random() % 345
时没有看到同样的问题。
答案 1 :(得分:0)
您需要对两个变量使用相同的类型,即:
let w1:UInt32 = 223
应该解决问题
错误是因为您尝试使用Int
和UInt32