2014-09-24 57 views
1

下面的代码得到编译错误:对雨燕需要咨询while语句

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

while (sum = a+b) < 2 { 

} 

的错误信息是:

Cannot invoke '<' with an argument list of type '((()), IntegerLiteralConvertible)'

如何解决这个问题呢? (当然,我可以把总和赋值语句出方的声明,但这种不方便任何其他意见感谢

+2

斯威夫特是不被认为是可怕的用C经常在斯威夫特成为非法C.代码。 – gnasher729 2014-09-24 14:35:54

回答

2

在许多其他语言,包括C和Objective-C,sum = a+b将返回sum价值,所以它不能比拟的。

在Swift中,这不起作用。这是有意完成的,以避免常见的程序员错误。从The Swift Programming Language

Swift supports most standard C operators and improves several capabilities to eliminate common coding errors. The assignment operator (=) does not return a value, to prevent it from being mistakenly used when the equal to operator (==) is intended.

由于赋值运算符不返回值,它不能与其他值进行比较。

不能重载默认赋值运算符(=),但可以创建新的运算符或重载其中一个复合运算符来添加此功能。但是,这对于您的代码的未来读者来说是不直观的,所以您可能只需将作业移至单独的一行。

1

在大多数语言中,任务传播自己的价值 - 。?那就是,当你调用

sum = a + b 

sum新值可用于表达的另一部分:

doubleSum = (sum = a + b) * 2 

夫特不起作用吨帽子的方式 - sum的值不是在赋值后可用,所以它不能在您的while语句中进行比较。从Apple's documentation

This feature prevents the assignment operator (=) from being used by accident when the equal to operator (==) is actually intended. By making if x = y invalid, Swift helps you to avoid these kinds of errors in your code.

1

你可以把它改写为for循环,虽然你将不得不重复分配和增加:

for sum = a+b; sum < 2; sum = a+b { 

} 
1

其他的答案解释为什么你的代码将无法编译。这里是你如何清理不while循环计算sum(我假设你希望能够重新分配sum的吸气剂是什么东西,在其他地方。):

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 {