2014-07-23 50 views
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的第二天。我希望我的問題不是太愚蠢。我可能還會遇到其他一些錯誤。

謝謝!

回答

1

我不明白爲什麼你需要B到是Equatable - 因爲你比較值,你只需要他們Comparable

func comparing<A, B: Comparable >(f: A -> B) -> (A,A) -> Bool { 
    return { f($0) < f($1) } 
} 

如果需要B到符合既EquatableComparable,你可以使用where子句中添加額外的約束:

func comparing<A, B: Comparable where B: Equatable>(f: A -> B) -> (A, A) -> Bool { 
    return { f($0) < f($1) } 
} 
+0

非常感謝您!是的,那確實是錯誤的協議。你碰巧知道,爲什麼Comparable只定義了<=, > =和>而不是<?我從另一種語言瞭解到,一個操作員可以被其他人表達。你知道Swift是否也支持協議中某些方法的默認實現?也可能有一個<需要Comparable協議的通用定義,但我只找到一個。同樣對於我的類,SomeType現在實現了Comparable,但我不需要提供更多的實現。 '<' - 實現似乎已經足夠了。你碰巧知道爲什麼? – thetrutz

+0

如果你已經定義了足夠多的操作符,編譯器可以找出其他的。我猜'SomeType'實現了'Equatable',對吧?如果編譯器知道'<'和'==',它可以自己將'<=', '> ='和'>'放在一起。 –