generics - Swift通用类型变量应符合协议(类型类)

我正在尝试用swift编写一个helper函数,这样可以更方便地排序。以下是我所拥有的和有效的:

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”需要遵守“Equatable”协议。我不知道怎么做到。编译器抱怨“B”不能转换为“UInt8”,因为它假定两个int要由“<”函数进行比较。如果我覆盖“<”,例如:
@infix func <(lhs: SomeType, rhs: SomeType) -> Bool {
    return lhs.i < rhs.i
}

然后编译器采用某种类型而不是UInt8。
今天是我和斯威夫特玩的第二天。我希望我的问题不要太愚蠢。我可能还会犯很多其他的错误。
谢谢您!

最佳答案

我不太清楚为什么你需要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) }
}

本文翻译自 https://stackoverflow.com/questions/24915626/

网站遵循 CC BY-SA 4.0 协议,转载或引用请注明出处。

标签 generics swift protocols type-constraints type-variables


相关文章:

c# - SortedList和SortedDictionary有什么区别?

swift - 如何在Swift中保存和还原NSScrollView滚动位置?

swift - ARKit –将OBJ或DAE转换为arobject

ios - 从UITableView删除自定义的行

java - 数据结构(Weiss Java书):为什么在BinaryHeap <T>数组而不是T []中分配Comparable []?

java - 如何在链接列表中实现泛型<E>?

c# - 没有从'System.Collections.Generic.IList <double>'到'System.Collections.IList'的隐式引用转换。

swift - AVAudioPlayer在Swift 4.2中产生延迟

ios - 不符合协议

swift - Swift使用委托实现多个协议