找不到接受提供的参数的'/'的重载

  发布于 2023-01-12 08:37

在Swift中没有这样的隐式转换,所以你必须自己明确地转换它:

average = Double(total) / Double(numbers.count)

来自Swift编程语言:"值永远不会被隐式转换为另一种类型."(章节:快速游览)

但是你现在使用的是Swift,而不是Objective-C,所以试着以更加功能的方式思考.你的功能可以像这样写:

func getAverage(numbers: Int...) -> Double {
    let total = numbers.reduce(0, combine: {$0 + $1})
    return Double(total) / Double(numbers.count)
}

reduce将第一个参数作为累加器变量的初始值,然后将该combine函数应用于累加器变量和数组中的每个元素.在这里,我们传递一个匿名函数,该函数使用$0$1表示它传递的第一个和第二个参数并将它们相加.

更简洁,你可以这样写:numbers.reduce(0, +).

请注意类型推断是如何做到仍然发现这total是一个很好的工作Int.

2 个回答
  • 编译器/根据您的输入和输出参数选择运算符的实现.在您的情况下,输入参数是两个Int值,输出参数是Double.这是编译器正在寻找的:

    func / (left: Int, right: Int) -> Double
    

    但是,没有/运算符的这种实现,这就是你得到错误的原因.执行此操作时Double(total/numbers.count),输出参数将更改为Int编译器为/存在的运算符选择以下实现的原因:

    func / (left: Int, right: Int) -> Int
    

    这就是为什么你得到的结果,4而不是4.5结果,即使你把结果转换成Double后来.

    您可以提供自己/运营商实施,首先将您的号码转换为Doubles:

    func / (left: Int, right: Int) -> Double {
        return Double(left) / Double(right)
    }
    

    然后,您可以执行以下操作:

    let a: Int = 3
    let b: Int = 2
    let c: Double = a/b  // -> 1.5
    

    2023-01-12 08:41 回答
  • 在Swift中没有这样的隐式转换,所以你必须自己明确地转换它:

    average = Double(total) / Double(numbers.count)
    

    来自Swift编程语言:"值永远不会被隐式转换为另一种类型."(章节:快速游览)

    但是你现在使用的是Swift,而不是Objective-C,所以试着以更加功能的方式思考.你的功能可以像这样写:

    func getAverage(numbers: Int...) -> Double {
        let total = numbers.reduce(0, combine: {$0 + $1})
        return Double(total) / Double(numbers.count)
    }
    

    reduce将第一个参数作为累加器变量的初始值,然后将该combine函数应用于累加器变量和数组中的每个元素.在这里,我们传递一个匿名函数,该函数使用$0$1表示它传递的第一个和第二个参数并将它们相加.

    更简洁,你可以这样写:numbers.reduce(0, +).

    请注意类型推断是如何做到仍然发现这total是一个很好的工作Int.

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