Swift - 如何编写通用的 max 函数

Swift - How to write generic max function

我是 Swift 的新手,我想编写一个通用的 max 函数来比较两个参数和 returns 较大的参数,用于 Int、Double 等基本类型。

func max<T>(_ num1:T, _ num2:T) -> T {
    return (num1 > num2) ? num1 : num2;
}

但我发现这不起作用,报告说二元运算 '>' 不能应用于两个 'T' 操作数。

我看到了一个关于通用 add 函数的例子 Here

protocol Summable { static func +(lhs: Self, rhs: Self) -> Self }
extension Int: Summable {}
extension Double: Summable {}

func add<T: Summable>(x: T, y: T) -> T {
  return x + y
}

所以我认为我的 max 功能也应该有一个协议。所以这是我的尝试:

protocol Comparable {
    static func >(lhs: Self, rhs: Self) -> Self
}
extension Int:Comparable {}
extension Double:Comparable {}

但这不起作用。我知道 Swift 提供了一个 Comparable 协议,但我想自己尝试一下。你能帮忙吗?

protocol TempComparable {
    static func >(lhs:Self, rhs:Self) -> Bool;
}

func max<T:TempComparable>(_ num1:T, _ num2:T) -> T {
    return (num1 > num2) ? num1 : num2;
}

您需要的是将您的协议创建为 Comparable 的子协议,并提供一个唯一的名称,而不是将其命名为与现有类型相同的名称,这会导致混淆。并在协议的扩展中实现协议要求,并使所需的类型符合协议。方法如下:

protocol CustomComparable: Comparable {
    static func > (lhs: Self, rhs: Self) -> Self
}
extension CustomComparable {
    static func > (lhs: Self, rhs: Self) -> Self {
        lhs > rhs ? lhs : rhs
    }
}
extension Int: CustomComparable {}
extension Double: CustomComparable {}