首页 文章

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

提问于
浏览
132

The Swift Programming Language中,它说:

函数也可以使用可变数量的参数,将它们收集到一个数组中 . func sumOf(numbers:Int ...) - > Int

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

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

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

这会因编译器错误而失败,“无法找到接受所提供参数的'__conversion'的重载” . 有没有办法将现有数组转换为可以传递给可变函数的元素列表?

6 回答

  • 1

    你可以施放这个功能:

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

    您可以使用辅助函数:

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

    Splatting is not in the language yet,由开发者证实 . 现在的解决方法是使用重载或等待,如果您不能添加重载 .

  • 83

    这是我发现的一项工作 . 我知道这不是你想要的,但似乎有效 .

    第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)
    }
    

    第3步:呼叫任何一种方式:

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

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

    此外,使用此方法,如果Apple更新语言@ manojid的答案建议,您只需要更新这些功能 . 否则,你将不得不经历并进行大量重命名 .

  • 14

    我知道这个回答没有回答你的确切问题,但我觉得值得注意 . 我也开始玩Swift并立即遇到类似的问题 . 对于你的问题,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])
    

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

  • 1

    我做了这个(包装器身份映射):

    func addBarButtonItems(types: REWEBarButtonItemType...) {
        addBarButtonItems(types: types.map { $0 })
    }
    
    func addBarButtonItems(types: [REWEBarButtonItemType]) {
        // actual implementation
    }
    

相关问题