【问题标题】:How do I add two generic values in Swift?如何在 Swift 中添加两个通用值?
【发布时间】:2015-05-05 07:26:39
【问题描述】:

我正在尝试编写一个函数来对数字类型数组求和。这是据我所知:

protocol Numeric { }
extension Float: Numeric {}
extension Double: Numeric {}
extension Int: Numeric {}

func sum<T: Numeric >(array:Array<T>) -> T{
    var acc = 0.0
    for t:T in array{
        acc = acc + t
    }
    return acc
}

但我不知道如何在Numeric 协议中定义+ 运算符的行为。

【问题讨论】:

    标签: swift generics


    【解决方案1】:
    protocol Numeric {
        func +(lhs: Self, rhs: Self) -> Self
    }
    

    应该够了。

    来源:http://natecook.com/blog/2014/08/generic-functions-for-incompatible-types/

    【讨论】:

    • 试试sum.reduce(0){ $0 + $1}
    • 我认为对于问题中描述的问题,Bedis 评论是“更 Swift”的解决方案
    • @AbhishekBedi 的答案如果不添加 @Sunkas 的声明将不起作用。问题是,如果你只有一个Numeric 数组,而Numeric 协议是完全空的,编译器不知道如何添加其中的两个。
    • 只是一个小补充,在 Swift 4.2 上,编译器在函数之前需要 'static' 关键字。协议数字 { 静态函数 +(lhs: Self, rhs: Self) -> Self }
    【解决方案2】:

    我是这样做的,但我只是想添加两个值而不是使用数组,但我认为这可能会有所帮助。

    func addTwoValues<T:Numeric>(a: T, b: T) -> T {
    return a + b
    }
    print("addTwoValuesInts = \(addTwoValues(a: 3, b: 4))")
    print("addTwoValuesDoubles = \(addTwoValues(a: 3.5, b: 4.5))")
    

    【讨论】:

    • 除非您将 + 运算符添加到 Numeric,否则这将不起作用。
    • 它确实有效。我在操场上做了那个确切的代码,它打印出来并正常工作。试试看。
    • 我收到了错误Binary operator '+' cannot be applied to two 'T' operands,这是绝对正确的。假设有人符合extension UIView: Numeric { }addTwoValues 将如何处理它?
    • 只有在没有带有 T 泛型的数字协议时才会出现该错误。我现在在操场上有那个代码,它运行并在消息中打印出正确的值
    • 这不是真的。如果协议是空的(这是 OP 定义它的方式,也是我在操场上定义它的方式),由于我上面所述的原因,它将不起作用。能够在符合空协议的任何两个对象上 + 是没有意义的。接受的答案就是所需要的。
    【解决方案3】:

    从 Swift 5 开始,有一个内置的 AdditiveArithmetic 协议,您可以将其限制为:

    func sum<T: AdditiveArithmetic >(array:Array<T>) -> T{
        var acc = T.zero
        for t in array{
            acc = acc + t
        }
        return acc
    }
    

    现在您无需手动将内置类型与协议保持一致:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多