将数组传递给Swift中参数数目可变的函数

将数组传递给Swift中参数数目可变的函数,swift,variadic-functions,Swift,Variadic Functions,在这方面,它说: 函数还可以接受数量可变的参数,将它们收集到一个数组中 func sumOf(numbers: Int...) -> Int { ... } 当我用逗号分隔的数字列表(`sumOf(1,2,3,4))调用这样一个函数时,它们在函数中作为数组可用 问题:如果我已经有一个要传递给这个函数的数字数组,该怎么办 let numbers = [1, 2, 3, 4] sumOf(numbers) 此操作失败,编译器错误为“找不到接受所提供参数的“\uuu co

在这方面,它说:

函数还可以接受数量可变的参数,将它们收集到一个数组中

  func sumOf(numbers: Int...) -> Int {
      ...
  }
当我用逗号分隔的数字列表(`sumOf(1,2,3,4))调用这样一个函数时,它们在函数中作为数组可用

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

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

此操作失败,编译器错误为“找不到接受所提供参数的“\uuu conversion”的重载”。是否有方法将现有数组转换为可以传递给变量函数的元素列表?

您可以使用帮助函数:

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

您可以使用以下帮助器函数:

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

,正如开发人员所确认的那样。目前的解决办法是,如果无法添加重载,则使用重载或等待。

,正如开发人员所确认的那样。目前的解决办法是,如果无法添加重载,则使用重载或等待。

我找到了一个解决办法。我知道这不完全是您想要的,但它似乎正在工作

步骤1:使用数组而不是可变参数声明所需的函数:

func sumOf(numbers: [Int]) -> Int {
    var total = 0
    for i in numbers {
        total += i
    }
    return total
}
步骤2:从可变变量函数中调用此函数:

func sumOf(numbers: Int...) -> Int {
    return sumOf(numbers)
}
typealias Function = [Int] -> Int
let sumOfArray = unsafeBitCast(sumOf, Function.self)
sumOfArray([1, 2, 3])
步骤3:以任意一种方式呼叫:

var variadicSum = sumOf(1, 2, 3, 4, 5)
var arraySum = sumOf([1, 2, 3, 4, 5])
这似乎很奇怪,但它在我的测试中起作用。请告诉我这是否会给任何人带来不可预见的问题。Swift似乎能够区分具有相同函数名的两个调用之间的差异


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

我发现了一个解决方法。我知道这不完全是您想要的,但它似乎正在工作

步骤1:使用数组而不是可变参数声明所需的函数:

func sumOf(numbers: [Int]) -> Int {
    var total = 0
    for i in numbers {
        total += i
    }
    return total
}
步骤2:从可变变量函数中调用此函数:

func sumOf(numbers: Int...) -> Int {
    return sumOf(numbers)
}
typealias Function = [Int] -> Int
let sumOfArray = unsafeBitCast(sumOf, Function.self)
sumOfArray([1, 2, 3])
步骤3:以任意一种方式呼叫:

var variadicSum = sumOf(1, 2, 3, 4, 5)
var arraySum = sumOf([1, 2, 3, 4, 5])
这似乎很奇怪,但它在我的测试中起作用。请告诉我这是否会给任何人带来不可预见的问题。Swift似乎能够区分具有相同函数名的两个调用之间的差异


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

我知道这个回答并不能回答你的确切问题,但我觉得值得注意。我也开始使用Swift并立即运行into一个类似的问题。我同意Manojlds的答案更适合你的问题,但我又想出了另一个解决办法。我也恰好喜欢Logan的更好

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

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])
func-sumOf(数字:数组)->Int{
var总和=0
数字中的数字{
总和+=数字
}
回报金额
}
var someNums=[8,7,2,9,12]
sumOf(someNums)
sumOf([10,15,20])

我只是想和大家分享一下,以防其他人也像我一样思考。大多数时候我更喜欢这样传递数组,但我还不认为“迅速地”传递。

我知道这个回答并不能回答你的确切问题,但我觉得值得注意。我也开始和斯威夫特一起玩,并立即遇到了一个类似的问题。我同意Manojlds的答案更适合你的问题,但我又想出了另一个解决办法。我碰巧也更喜欢洛根

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

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])
func-sumOf(数字:数组)->Int{
var总和=0
数字中的数字{
总和+=数字
}
回报金额
}
var someNums=[8,7,2,9,12]
sumOf(someNums)
sumOf([10,15,20])

我只是想和大家分享,以防有人像我一样思考。大多数情况下,我更希望像这样通过阵列,但我认为“快速”还没有

您可以强制转换函数:

func sumOf(numbers: Int...) -> Int {
    return sumOf(numbers)
}
typealias Function = [Int] -> Int
let sumOfArray = unsafeBitCast(sumOf, Function.self)
sumOfArray([1, 2, 3])

您可以强制转换函数:

func sumOf(numbers: Int...) -> Int {
    return sumOf(numbers)
}
typealias Function = [Int] -> Int
let sumOfArray = unsafeBitCast(sumOf, Function.self)
sumOfArray([1, 2, 3])
我这样做了(包装器+标识映射):

我这样做了(包装器+标识映射):


Swift 5

这是一种具有
@dynamicCallable
功能的方法,可以避免重载或
非安全比特广播
,但您应该创建一个特定的
结构
来调用:

@dynamicCallable
结构SumOf{
func dynamicallyCall(带参数args:[Int])->Int{
返回args.reduce(0,+)
}
}
设sum=SumOf()
//使用动态方法调用。
和(1,2,3)//6
//直接调用底层方法。
sum.dynamicallyCall(带参数:[1,2,3])//6

Swift 5

这是一种具有
@dynamicCallable
功能的方法,可以避免重载或
非安全比特广播
,但您应该创建一个特定的
结构
来调用:

@dynamicCallable
结构SumOf{
func dynamicallyCall(带参数args:[Int])->Int{
返回args.reduce(0,+)
}
}
设sum=SumOf()
//使用动态方法调用。
和(1,2,3)//6
//直接调用底层方法。
sum.dynamicallyCall(带参数:[1,2,3])//6

为什么不将函数配置为使用整数数组呢?当然可以,但我可能不是该函数的作者,也可能无法(或不想)更改它。我是Ach@Olebegeman,无法更改函数并阅读您的问题。。。现在仍然是解决方案。。。问候Berlin为什么不将函数配置为整数数组呢?当然,但我可能不是函数的作者,也可能无法(或不想)更改它。我是Ach@Olebegeman,无法更改函数并阅读您的问题。。。现在仍然是解决方案。。。问候柏林提供了一个用于阵列的版本。我认为问题的前提是原始函数需要
Int..
并且不能(轻易)更改?@delnan:正确。在我看来,应该有办法将数组传递到变量函数中,因为变量