2017-09-04 103 views
0

所以我有一個項目,建立好。但母雞我想將其封存灑在這行代碼此錯誤:二元運算符'>'不能應用於兩個'String ?!'操作數

let pred = NSPredicate(format: "%K in %@", "categoryID", selectedCategoryIDs!) 
let selectedAlmanacEntries = almanacEntries.filter { pred.evaluate(with: $0) }.sorted(by: { ($0 as AnyObject).title > ($1 as AnyObject).title }) 

此之前沒有被(早期版本)的問題。 已嘗試重新啓動Xcode並清理項目。 任何提示讚賞。

(Xcode中8,斯威夫特3)

回答

2

?!是一個真正偉大的建築,不是嗎?當你在錯誤信息中看到它時,完美地總結出反應。

無論如何,在Swift中,您最好轉換爲這些對象應該屬於的適當類型,而不是AnyObject。如果你必須使用duck類型,那麼你應該知道Swift每次調用AnyObject的方法時,它都會獲得一定的選擇性,因爲Swift無法驗證對象實際上是否響應該消息。所以你將不得不處理可選項。

另一個問題是,由於框架中存在多個類,其屬性名爲title,因此Swift無法知道要使用哪一個類。其中一些簽名不同;例如,NSButton具有被分類爲String一個title屬性,NSStatusItem具有被分類爲String?一個title屬性,NSWindowTab具有被分類爲String!一個title屬性。編譯器選擇哪一個是抽獎的一點點運氣,這就是爲什麼隨機機會可以使其從編譯到編譯的行爲不同。所以你需要告訴它什麼類型的期望來幫助編譯器。

所以,像這樣可以工作:

let selectedAlmanacEntries = almanacEntries.filter { pred.evaluate(with: $0) }.sorted(by: { 
    guard let first: String = ($0 as AnyObject).title else { return false } 
    guard let second: String = ($1 as AnyObject).title else { return true } 

    return first > second 
}) 

或者,如果你的心臟上長的單行設置爲原文:

let selectedAlmanacEntries = almanacEntries.filter { pred.evaluate(with: $0) }.sorted(by: { (($0 as AnyObject).title as String?) ?? "" > (($1 as AnyObject).title as String?) ?? "" }) 

我真的建議鑄造但實際的類型,而不是。

相關問題