?!
是一個真正偉大的建築,不是嗎?當你在錯誤信息中看到它時,完美地總結出反應。
無論如何,在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?) ?? "" })
我真的建議鑄造但實際的類型,而不是。