swift - 无法将“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://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))
解决方案
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 在他们的回答中所说:Double
Int
Double
return totalWithTax / Double(numPeople)
推荐阅读
- linux - 如何在不使用 Kubernetes (PKS) 中的 cron 作业的情况下运行节点自动缩放脚本
- javascript - 在 contenteditable 父 div 中的 div 上附加 keydown 事件侦听器不起作用?
- c++ - 没有匹配运算符[]
- sql - 内连接时非聚集索引的查询性能
- javascript - MathJax 和 KaTeX 在 HTML 中工作,但在 Javascript 中不工作
- excel - 如何在循环中创建多个变量并在 VBA 中赋值
- bash - 从makefile中的变量中提取子字符串
- laravel - 连接到 Podio API 失败:[92] 上传文件时
- java - 如何为 Genymotion 制作虚拟 SIM 卡
- python - 如何将 1 分钟数据重采样为 10 分钟数据?