在Swift 3中添加包含在字典中的双精度数

9

我正在学习一些关于Swift的知识,并且正在跟着一个Udemy课程学习。这个课程是用Swift 2教授的,而我正在使用Swift 3,所以希望能够理解输出差异,但我目前在网上找不到任何答案。
我有一个包含3个内容的字典项。

var menu = ["entre" : 5.55, "main-meal": 20.50, "desert": 5.50]

这个想法是使用教练的输出将3个值相加(在Swift 2中可以正常工作):

var totalCost = menu["entre"]! + menu["desert"]! + menu["main-meal"]!

在课程中这个可以正常工作,但对我来说会抛出一个错误,内容为:“无法下标化'inout[String: Double]'(又名'inout Dictionary')”

我发现很奇怪的是,如果我只使用2个值,一切都很好,问题是当第三个值添加时。我可以通过在末尾添加+ 0.0来解决问题,如下所示:

var totalCost = menu["entre"]! + menu["desert"]! + menu["main-meal"]! + 0.0

我希望了解的是这两个版本之间的区别,同时希望知道我在将它们三个相加时出了什么问题,而不需要使用我的解决方法。
提前感谢您。

3
欢迎来到Swift。你在第一天就发现了一个bug!我已经替你将其报告给了bugs.swift.org。谢谢! - matt
@GaryLO,你认为这样做有什么作用吗?字典的类型是[String: Double](无论是显式还是隐式)。你这样做只会导致加法表达式根本无法工作,但原因是其他的! - par
@par 如果您尝试为totalCost指定类型,例如var totalCost: Double = menu["entre"]! + menu["main-meal"]! + menu["desert"]!。它会抛出MyPlayground.playground:4:62: error: value of optional type 'Double?' not unwrapped; did you mean to use '!' or '?'?的错误提示。 - Gary LO
3
希望问题能够解决,我现在感觉不太傻了。Leo Dabus,我尝试过你的方法,结果与之前一样,唯一让它起作用的是在结尾处添加 +0.0。谢谢你替我报告这个错误,@matt。 - James Coate
显示剩余9条评论
1个回答

2

解决方法

针对少数按键的问题

let (entreCost, desertCost, mainCost) = (menu["entre"]!, menu["desert"]!, menu["main-meal"]!)

let totalCost = entreCost + desertCost + mainCost

对于很多密钥

let keysToSum = ["entre", "desert", "main-meal"]
keysToSum.map{ menu[$0]!}.reduce(0, +)

对于所有键

menu.values.reduce(0, +)

reduce 可能是他原来的问题更好的解决方案。但是,这个 bug 真是令人惊讶。 - jowie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接