【问题标题】:Adding any two numberic tuples in swift快速添加任意两个数字元组
【发布时间】:2019-01-11 09:32:02
【问题描述】:

我创建了一个函数来添加看起来像 (Int, Int) 的元组。

func +<T : Numeric> (x: (T, T), y: (T, T)) -> (T, T) {
    return (x.0 + y.0, x.1 + y.1)
}

它适用于(10, 20) + (15, 15)

现在我需要改进函数以接受任何相同长度的可变长度元组。

怎么可能?

最后(12) + (23)(10, 12, 16) + (11, 36, 25) 应该可以工作。

【问题讨论】:

  • 使用元组有什么特别的原因吗?当元组长度不等时会发生什么?
  • 你可以用可变参数来解决这个问题:这是一篇很棒的文章medium.com/@abhimuralidharan/…
  • @Jonathan 无法创建可变参数元组。
  • @Woodstock 当然它适用于元组
  • @Jonathan 没有。我想说的是完全错误的。他希望元组内的元素数量是可变的,而不是可变数量的元组。另外,顺便说一句,我不是伍德斯托克。 ¯_(ツ)_/¯

标签: ios swift generics


【解决方案1】:

元组需要在编译时确定其元素数量,因此类似可变参数的函数将不起作用。对于您需要支持的每个元组大小,您需要为 + 运算符添加覆盖:

func +<T : Numeric> (x: (T, T), y: (T, T)) -> (T, T) {
    return (x.0 + y.0, x.1 + y.1)
}

func +<T : Numeric> (x: (T, T, T), y: (T, T, T)) -> (T, T, T) {
    return (x.0 + y.0, x.1 + y.1, x.2 + y.2)
}

func +<T : Numeric> (x: (T, T, T, T), y: (T, T, T, T)) -> (T, T, T, T) {
    return (x.0 + y.0, x.1 + y.1, x.2 + y.2, x.3 + y.3)
}

// and so on, ...

或者,您可以切换到其他数据类型,例如允许动态数量的项目的数组:

infix operator ++ 

func ++<T: Numeric>(_ lhs: [T], _ rhs: [T]) -> [T] {
    return zip(lhs, rhs).map { $0.0 + $0.1 }
}

print([10, 12, 16] ++ [11, 36, 25]) // [21, 48, 41]

这种方法的注意事项:

  • 您需要使用不同的运算符,因为 + 已经为数组定义了,它连接数组而不是单独对相应的元素求和
  • 如果两个数组的大小不同,则结果将具有两个输入数组中较小数组的大小。

【讨论】:

  • 使用元组以外的任何类型,但将其保留为单个函数。
  • 它显示错误:没有匹配运算符声明的运算符实现
  • @Saranjith 你复制了infix operator ++ 部分吗?
【解决方案2】:

您可以使用@Cristik 建议的Array 解决方案,也可以使用闭包返回可变参数函数,例如:

func add<T : Numeric>(_ a: T...) -> (_ b: T...) -> [T] {
    return { (b: T...) -> [T] in
        return zip(a, b).map { $0.0 + $0.1 }
    }
}

let sum = add(1, 2,3)(4, 5, 6)

print(sum)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-24
    • 1970-01-01
    • 1970-01-01
    • 2019-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多