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

时间:2021-05-07 15:27:21

标签: swift double

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

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

我的实际结果是一个错误。

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


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

挑战 1 声明一个名为 TaxCalculator 的结构体 在里面申报一个名为 tax 的财产,并将其设置为一个十进制值,代表您居住的地方的销售税金额 在内部声明一个名为 totalWithTax 的方法,该方法接受 Double 作为输入参数并返回 Double 值。 在该方法中,编写代码以返回一个 Double 值,表示含税的输入数字

挑战 2 声明一个名为 BillSplitter 的结构体 在里面声明一个叫做 splitBy 的方法: 有一个表示小计的 Double 类型的输入参数 有一个 Int 类型的输入参数,表示人数 返回一个 Double 值 在该方法中,使用 TaxCalculator 的一个实例(来自上面的挑战 1)计算含税总额,然后按传入该方法的人数拆分账单。 返回每个人必须支付的金额。

挑战 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))

2 个答案:

答案 0 :(得分:2)

Mouse.getEventDWheel() 是一个 totalWithTaxDoublenumPeople

您也需要将 Int 转换为 numPeople

Double

return totalWithTax / Double(numPeople) 这样的运算符不适用于不匹配的类型。

答案 1 :(得分:2)

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)