首页 > 解决方案 > 无法将“Int”类型的值转换为预期的参数类型“Double”

问题描述

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

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

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

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


我们将在 Swift Playground 中尝试一些数学运算。打开 Xcode 并创建一个新的 Playground(File Menu->New->Playground)。从 Playground 模板列表中,选择“Blank”</p>

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

挑战 2 声明一个名为 BillSplitter 的结构 在内部声明一个名为 splitBy 的方法 that: 有一个 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

有错误的代码图像

没有错误的代码图像

//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))

标签: swiftdouble

解决方案


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

byte->int->long int->float->double 都默默发生。

在 C 中,这段代码可以正常工作:

int a = 2;
double b = 2.5;

double c = a * b;

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

斯威夫特不是这样。

在 Swift 中,您必须显式地a转换为双精度数。除非您明确地将a 转换为 a ,否则它不会让您将 aInt和 a相乘,正如 aheze 在他们的回答中所说:DoubleIntDouble

return totalWithTax / Double(numPeople)

推荐阅读