2014-10-08 38 views
4

根據斯威夫特本書從蘋果,而不是隱含回報率迅速操場

let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"] 
var reversed = sorted(names, { s1, s2 in return s1 > s2 }) 

,因爲封閉的體內含有一種單一的表達S1> S2返回一個布爾值,有沒有歧義,所以關鍵字可以省略:

reversed = sorted(names, { s1, s2 in s1 > s2 }) 

嗯,這並不在遊樂場工作。 Playground中的錯誤說模糊使用運算符'>'

更新:同樣,這

reversed = sorted(names, { $0 > $1 }) 

不起作用。同樣的錯誤。這

reversed = sorted(names, { return $0 > $1 }) 

呢。

更新2:看到Mike S的回答後,我確信這個錯誤可能是由於Swift String和NSString引起的。我試過

let nums = [3, 5, 1, 2, 10, 9] 
var dec = sorted(nums, { n1, n2 in n1 > n2 }) 
var inc = sorted(nums, { n1, n2 in n1 < n2 }) 

他們都在使用或不使用import語句。對於String的解決方法並不壞,因爲現在我們只需要使用>運算符來比較String就可以輸入return。

那麼這裏有什麼解釋(沒有在正常項目中檢查)?

+0

呵呵,swift手冊的完美例子 - 也不適用於一個項目。 – 2014-10-08 05:36:40

+0

我也注意到了這一點。他們可能已經刪除了這個特別的捷徑。 – 2014-10-08 05:59:39

+0

有趣的是,這些都與'<'運算符一起工作。 – 2014-10-08 06:01:09

回答

5

這裏的問題實際上與比較String s。一個ArrayInt s與<>運營商工作得很好,但ArrayStrings s,只有<運營商將工作(無論如何,Xcode 6.1 GM)。

表明它與String比較的問題,試試這個在操場:

import Foundation 
let result1 = "Chris" < "Alex" // false 
let result2 = "Chris" > "Alex" // error: ambiguous use of operator '>' 

如果打開遊樂場的控制檯輸出,你還會看到:

Playground execution failed: <EXPR>:17:9: error: ambiguous use of operator '>' 
"Chris" > "Alex" 
     ^
Foundation.>:1:6: note: found this candidate 
func >(lhs: String, rhs: NSString) -> Bool 
    ^
Foundation.>:1:6: note: found this candidate 
func >(lhs: NSString, rhs: String) -> Bool 

所以,問題似乎是編譯器在確定"Chris""Alex"String s還是NSString s時遇到問題。

而且,如果你把默認import聲明在操場上方,一切都將正常工作,因爲NSString不是進口的,因此,不橋接String

let result1 = "Chris" < "Alex" // false 
let result2 = "Chris" > "Alex" // true 

或者,使用問題的代碼(沒有import):

let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"] 
let reversed = sorted(names, { $0 > $1 }) // [Alex, Barry, Chris, Daniella, Ewa] 

我不能回答,雖然是什麼,是爲什麼>確實 WOR k如果在傳遞給sorted的封閉中使用return語句。

+0

我確信。對我來說足夠好。看起來像編譯器中的錯誤。解決方法真的很「痛苦」,因爲我現在每次都必須輸入回車。 – 2014-10-08 13:09:08