无法将类型 'Int' 的值转换为预期的参数类型 'Double'

Cannot convert value of type 'Int' to expected argument type 'Double'

所以我正在学习这门名为“与 Chris 一起编程 - 14 天初学者挑战 (SwiftUI)”的课程(是的,我是初学者),每节课后,都有一个挑战,我几乎完成了挑战,但我不知道为什么它不起作用,所以我检查了已完成挑战的保管箱,我得到的一切都差不多,我找到了一个类似于源的解决方案但是我仍然不明白为什么我的第一个版本(第一张图片)不起作用。我从源代码中复制了所有相同的内容,但它不起作用。有没有可能是源代码错误的作者,而不是我?

我的预期结果是“Int”像“Double”一样工作,人数是 5,所以我不明白为什么它不会。

我的实际结果是错误的。

我的目标是完成这个挑战:


我们将在 Swift 游乐场中尝试一些数学运算。 打开 Xcode 并创建一个新的游乐场 (文件菜单->新建->游乐场)。 从 Playground 模板列表中,只有 select“空白”

挑战 1 声明一个名为 TaxCalculator 的结构 在名为 tax 的内部声明一个 属性 并将其设置为代表您居住地的销售税金额的十进制值 在内部声明一个名为 totalWithTax 的方法,它接受一个 Double 作为输入参数和 returns 一个 Double 值。 在该方法中,将代码写入 return 表示含税输入数字的 Double 值

挑战二 声明一个名为 BillSplitter 的结构 在内部声明一个名为 splitBy 的方法: 具有表示小计的 Double 类型的输入参数 有一个 Int 类型的输入参数,表示人数 returns 一个 Double 值 在该方法内,使用 TaxCalculator 的一个实例(来自上面的挑战 1)计算含税总额,然后根据传入该方法的人数拆分账单。 Return每个人必须支付的金额。

挑战 3 创建 BillSplitter 的实例 使用实例打印出每个人支付的金额(假设5个人,一张120美元的账单)


我正在使用的课程代码: https://www.dropbox.com/sh/7aopencivoiegz4/AADbxSj83wt6mPNNgYcARFAsa/Lesson%2009?dl=0&file_subpath=%2FL9+Challenge+Solution.playground%2FContents.swift&preview=L9+Challenge+Solution.zip&subfolder_nav_tracking=1

an image of the code with an error

an image of the code without an error

//https://learn.codewithchris.com/courses/take/start/texts/18867185-lesson-9-challenge
//Challenge1
struct TaxCalculator{
    
    var tax = 0.15
    
    func totalWithTax(_ subtotal:Double) -> Double{
        return subtotal * (1 + tax)
    }
}

//Challenge2
struct BillSplitter {
    
    func splitBy(subtotal:Double, numPeople:Int //here is the problem) ->Double {
        
        let taxCalc = TaxCalculator()
        let totalWithTax = taxCalc.totalWithTax(subtotal)
        
        return totalWithTax/numPeople
    }
}

let Split = BillSplitter()
print(Split.splitBy(subtotal: 120, numPeople: 5))

totalWithTax 是一个 DoublenumPeople 是一个 Int.

您也需要将 numPeople 转换为 Double

return totalWithTax / Double(numPeople)

/ 这样的运算符不能处理不匹配的类型。

Swift 对于标量类型来说有点麻烦。只要不丢失数据,大多数 C 系列语言都会悄悄地将标量类型“提升”为其他类型。

byte->int->long int->float->double 都悄无声息地发生。

在 C 中,此代码有效:

int a = 2;
double b = 2.5;

double c = a * b;

a 被提升为双精度值,结果是包含双精度值 5.0。

Swift 并非如此。

在 Swift 中,您必须明确地将 a 转换为双精度数。它不会让你将 IntDouble 相乘,除非你明确地将 Int 转换为 Double,正如 aheze 在他们的回答中所说:

return totalWithTax / Double(numPeople)