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 {}
我是 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 {}