假设我想要添加数组条目的所有值。不仅是整数,还有双值或我自己创建的一些实现+运算符的类型。所以我的问题是:如果类型实现运算符,是否可以使用基于事实的约束来创建这样的函数?比如或类似的东西(显然这不起作用)。
提前致谢
答案 0 :(得分:1)
有几种方法可以解决问题。
虽然我知道没有明确的方式说“嘿Swift,我想只允许T有这个操作符的类型T”,我们通常认为所有类型都能够被添加,减去,相乘和分割自动符合到IntegerArithmeticType
,它可以用作任何通用函数或类型的通用约束。
例如:
func addAll<T: IntegerArithmeticType>(array: [T]) -> T {
var count = array[0]
for (index, value) in array.enumerate() {
if index != 0 {
count += value
}
}
return count
}
注意在这个快速模型版本中,我使用数组的第一个值初始化count
,然后通过在for循环内检查索引0来避免重复计算。我无法将count
初始化为0,因为0是Int
,而我希望count
属于T
类型。
你提到你自己的类型也适用于此。一种选择是让您的自定义类型符合IntegerArithmeticType
,但它需要的不仅仅是+
运算符。有关IntegerArithmeticType
的详细信息,请参阅SwiftDoc。
如果符合IntegerArithmeticType
对您施加某种限制,您可以使用+
功能以及您想要的任何其他要求创建自定义协议。毕竟,操作员实际上只是功能。请注意,您可以使用扩展名添加已存在类型的一致性。例如:
protocol Addable {
func +(left: Self, right: Self) -> Self
// Other requirements...
}
extension Int: Addable {}
extension Double: Addable {}