我有以下功能:
func myFunc<T>(t1: T, t2: T) -> T {
return t1 + t2
}
编译器(正当地)不允许这样做,因为它不知道T
是否支持添加。有没有办法指定T
必须支持添加,就像可以指定T
必须符合给定协议的方式一样?我在线查看,找不到任何可以保证支持+
的协议。
答案 0 :(得分:1)
您需要指定类型(T)支持添加。 您可以通过声明自定义协议来执行此操作,例如:
protocol Addition {
func +(lhs: Self, rhs: Self) -> Self
}
现在只需指定T实现它:
func myFunc<T: Addition>(t1: T, t2: T) -> T {
return t1 + t2
}
最后一步是将您想要作为参数传递的类型扩展到您的函数以实现此协议,例如Int:
extension Int: Addition {}
你甚至不必实现+功能,因为Int已经做到了。 你可以扩展你想要的任何类型,包括其他协议来实现加法一,然后将安全传递给你的函数:
myFunc(2, t2: 4)
// EDITED
您可以使用实现+, - ,*,/,%的协议IntegerArithmeticType
,但这一切都取决于您的要求。
如果您创建要将实例传递给函数的自定义类,则必须实现所有操作,但是如果您只在Int等标准类型上调用函数。您可以节省时间,而无需创建自定义协议。例如:
func myFunc<T: IntegerArithmeticType>(t1: T, t2: T) -> T {
return t1 + t2
}
myFunc(2, t2: 4)