1
我想在swift中編寫一個幫助函數,它允許更方便地進行排序。以下是我有什麼工作:Swift通用類型變量應該遵循一個協議(類型類)
someArray.sorted({ someGetter($0) < someGetter($1) })
相反,我還想寫
someArray.sorted(comparing(someGetter))
我試圖像這樣定義
func comparing<A,B : Equatable>(f: A -> B) -> ((A,A) -> Bool) {
return { f($0) < f($1) }
}
的問題是比較功能,類型檢查者不知道,'B'需要符合'可衡量'協議。我不知道如何實現這一點。編譯器抱怨'\'B \'不能轉換爲\'UInt8 \',因爲它假定兩個Ints被'<'函數比較。如果我用例如:
@infix func <(lhs: SomeType, rhs: SomeType) -> Bool {
return lhs.i < rhs.i
}
覆蓋「<」,那麼編譯器假定SomeType而不是UInt8。
這是我玩Swift的第二天。我希望我的問題不是太愚蠢。我可能還會遇到其他一些錯誤。
謝謝!
非常感謝您!是的,那確實是錯誤的協議。你碰巧知道,爲什麼Comparable只定義了<=, > =和>而不是<?我從另一種語言瞭解到,一個操作員可以被其他人表達。你知道Swift是否也支持協議中某些方法的默認實現?也可能有一個<需要Comparable協議的通用定義,但我只找到一個。同樣對於我的類,SomeType現在實現了Comparable,但我不需要提供更多的實現。 '<' - 實現似乎已經足夠了。你碰巧知道爲什麼? – thetrutz
如果你已經定義了足夠多的操作符,編譯器可以找出其他的。我猜'SomeType'實現了'Equatable',對吧?如果編譯器知道'<'和'==',它可以自己將'<=', '> ='和'>'放在一起。 –