繁体   English   中英

基于运算符的Swift通用约束

[英]Swift generic constraints based on operator

假设我想将一个数组项的所有值加起来。 我不仅创建了整数,而且还创建了双精度值或我自己创建的实现+运算符的某种类型。 所以我的问题是:是否有可能基于类型是否实现了运算符的事实创建具有约束的函数? 诸如此类的东西(显然这是行不通的)。

提前致谢

有几种方法可以解决此问题。

IntegerArithmeticType

尽管我没有明确的说法“嘿,斯威夫特,我只想允许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而我希望countT类型。

您提到了使用自己的类型也可以。 一种选择是让您的自定义类型符合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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM