需要有关Swift while声明的建议

时间:2014-09-24 14:13:06

标签: ios swift

以下代码出现编译错误:

var a : Int = 0
var b : Int = 3
var sum : Int = 0

while (sum = a+b) < 2 {

}

错误消息是:

  

无法调用'&lt;'使用类型'((())的参数列表,   IntegerLiteralConvertible)'

如何解决这个问题? (当然我可以将 sum 赋值语句放在 while 语句旁边。但这不方便。还有其他建议吗?谢谢

4 个答案:

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