以下代码出现编译错误:
var a : Int = 0
var b : Int = 3
var sum : Int = 0
while (sum = a+b) < 2 {
}
错误消息是:
无法调用'&lt;'使用类型'((())的参数列表, IntegerLiteralConvertible)'
如何解决这个问题? (当然我可以将 sum 赋值语句放在 while 语句旁边。但这不方便。还有其他建议吗?谢谢
答案 0 :(得分:2)
在许多其他语言中,包括C和Objective-C,sum = a+b
会返回sum
的值,因此可以进行比较。
在Swift中,这不起作用。这是为了避免常见的程序员错误而故意完成的。来自The Swift Programming Language:
Swift支持大多数标准C运算符,并改进了几种消除常见编码错误的功能。赋值运算符(=)不返回值,以防止在等于运算符(==)时错误地使用它。
由于赋值运算符未返回值,因此无法将其与其他值进行比较。
无法重载默认赋值运算符(=),但您可以创建新运算符或重载其中一个复合运算符以添加此功能。但是,这对于您的代码的未来读者来说是不直观的,因此您可能只想将分配移动到单独的行。
答案 1 :(得分:1)
在大多数语言中,分配会传播其值 - 也就是说,当您调用
时sum = a + b
sum
的新值可用于表达式的另一部分:
doubleSum = (sum = a + b) * 2
Swift无法正常工作 - 分配后sum
的值不可用,因此无法在while
语句中进行比较。来自Apple's documentation:
此功能可防止使用赋值运算符(=) 当等于运算符(==)实际意图时发生意外。通过 如果x = y无效,Swift会帮助你避免这些 代码中的错误。
答案 2 :(得分:1)
您可以将其重写为for
循环,但您必须重复分配和添加:
for sum = a+b; sum < 2; sum = a+b {
}
答案 3 :(得分:1)
其他答案解释了为什么您的代码无法编译。以下是如何清理它而不在while循环中计算sum
(我假设您希望能够在其他地方重新分配sum
的getter是什么。):
var a = 0, b = 3
var getSum = { a + b }
var sum: Int { return getSum() }
while sum < 2 {
...如果您可以使用括号调用sum
:
var a = 0, b = 3
var sum = { a + b }
while sum() < 2 {