将数组传递给Swift中具有可变数量的args的函数

Passing an array to a function with variable number of args in Swift

在Swift编程语言中,它表示:

Functions can also take a variable number of arguments, collecting them into an array.

1
2
3
  func sumOf(numbers: Int...) -> Int {
      ...
  }

当我用逗号分隔的数字列表(`sumof(1,2,3,4)调用这样的函数时,它们作为函数内的数组提供。

问题:如果我已经有了一个要传递给这个函数的数字数组怎么办?

1
2
let numbers = [1, 2, 3, 4]
sumOf(numbers)

此操作失败,出现编译器错误,"找不到接受所提供参数的"uu conversion"的重载"。有没有一种方法可以将现有数组转换为元素列表,我可以将其传递给变量函数?


据开发人员确认,喷溅还没有使用语言。现在的解决方法是使用重载,或者在无法添加重载时等待。


这是我找到的一份工作。我知道这不完全是你想要的,但它似乎在起作用。

步骤1:用数组而不是可变参数声明您想要的函数:

1
2
3
4
5
6
7
func sumOf(numbers: [Int]) -> Int {
    var total = 0
    for i in numbers {
        total += i
    }
    return total
}

第2步:在variadic函数中调用它:

1
2
3
func sumOf(numbers: Int...) -> Int {
    return sumOf(numbers)
}

第3步:任意呼叫:

1
2
var variadicSum = sumOf(1, 2, 3, 4, 5)
var arraySum = sumOf([1, 2, 3, 4, 5])

这看起来很奇怪,但它在我的测试中起作用。如果这会给任何人带来不可预见的问题,请告诉我。Swift似乎能够区分具有相同函数名的两个调用之间的差异。

此外,如果苹果按照@manojid的回答建议更新语言,那么您只需要更新这些函数。否则,您将不得不进行大量的重命名。


您可以强制转换函数:

1
2
3
typealias Function = [Int] -> Int
let sumOfArray = unsafeBitCast(sumOf, Function.self)
sumOfArray([1, 2, 3])


您可以使用helper函数,例如:

1
2
func sumOf (numbers : [Int])  -> Int { return numbers.reduce(0, combine: +) }
func sumOf (numbers : Int...) -> Int { return sumOf (numbers) }


我这样做了(包装+身份映射):

1
2
3
4
5
6
7
func addBarButtonItems(types: REWEBarButtonItemType...) {
    addBarButtonItems(types: types.map { $0 })
}

func addBarButtonItems(types: [REWEBarButtonItemType]) {
    // actual implementation
}


我知道这个回答不能回答你确切的问题,但我觉得值得注意。我也开始和斯威夫特玩了,然后立刻遇到了一个类似的问题。Manojlds的回答更适合你的问题,我同意,但我再次提出了另一个解决方法。我也更喜欢洛根。

在我的例子中,我只想传递一个数组:

1
2
3
4
5
6
7
8
9
10
11
func sumOf(numbers: Array<Int>) -> Int {
    var sum = 0
    for number in numbers {
        sum += number
    }
    return sum
}

var someNums = [8,7,2,9,12]
sumOf(someNums)
sumOf([10, 15, 20])

只是想分享,以防其他人像我一样思考。大多数时候我更喜欢像这样传递数组,但我还不认为是"快速"的。:)