[英]Swift generic constraints based on operator
假设我想将一个数组项的所有值加起来。 我不仅创建了整数,而且还创建了双精度值或我自己创建的实现+运算符的某种类型。 所以我的问题是:是否有可能基于类型是否实现了运算符的事实创建具有约束的函数? 诸如此类的东西(显然这是行不通的)。
提前致谢
有几种方法可以解决此问题。
尽管我没有明确的说法“嘿,斯威夫特,我只想允许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对照来避免重复计数。 我无法使用0初始化count
,因为0是一个Int
而我希望count
是T
类型。
您提到了使用自己的类型也可以。 一种选择是让您的自定义类型符合IntegerArithmeticType
,尽管它不仅需要+
运算符,而且还需要很多其他功能。 有关详细信息IntegerArithmeticType
,看到SwiftDoc 。
如果符合IntegerArithmeticType
对您施加了某种限制,则可以使用+
函数以及您想要的任何其他要求来创建自定义协议。 毕竟,运算符实际上只是功能。 请注意,您可以添加对已有扩展名的一致性。 例如:
protocol Addable {
func +(left: Self, right: Self) -> Self
// Other requirements...
}
extension Int: Addable {}
extension Double: Addable {}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.