gpt4 book ai didi

generics - Swift 通用类型变量应遵守协议(protocol)(类型类)

转载 作者:行者123 更新时间:2023-11-28 07:17:29 28 4
gpt4 key购买 nike

我正在尝试用 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”需要遵守“Equatable”协议(protocol)。我不知道如何实现这一目标。编译器提示 '\'B\' 不可转换为\'UInt8\'',因为它假定两个 Int 由 '<' 函数进行比较。如果我覆盖 '<' 例如:

@infix func <(lhs: SomeType, rhs: SomeType) -> Bool {
return lhs.i < rhs.i
}

然后编译器采用 SomeType 而不是 UInt8。

这是我使用 Swift 的第二天。我希望我的问题不是太愚蠢。我可能还会犯很多其他错误。

谢谢!

最佳答案

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

关于generics - Swift 通用类型变量应遵守协议(protocol)(类型类),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24915626/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com