对Swift中余数运算符的行为感到困惑

时间:2014-06-05 12:46:36

标签: swift

我正在尝试使用arc4random和%运算符计算约束到特定范围的两个随机数。

Issue with % operator

我无法弄清楚为什么编译器在计算(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
)

2 个答案:

答案 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

应该解决问题

错误是因为您尝试使用IntUInt32

相关问题