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

 暗恋具体哦 发布于 2023-01-11 19:15

在Swift编程语言中,它说:

函数也可以采用可变数量的参数,将它们收集到一个数组中.

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

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

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

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

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

4 个回答
  • 正如开发人员所证实的,Splatting还没有语言.现在的解决方法是使用重载或等待,如果您不能添加重载.

    2023-01-11 19:17 回答
  • 您可以使用辅助函数:

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

    2023-01-11 19:19 回答
  • 这是我发现的一项工作.我知道这不是你想要的,但似乎有效.

    第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的答案建议,您只需要更新这些功能.否则,您将不得不经历并进行大量重命名.

    2023-01-11 19:20 回答
  • 你可以施放这个功能:

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

    2023-01-11 19:20 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有