2014-09-24 101 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 {