在任何人发送我查看之前的帖子之前,请知道我已经看了很多,而且我的新手状态阻止我实施以前可能相关或可能不相关的答案。
我正在学习使用Swift编写iOS代码,作为练习我正在构建一个简单的应用程序来将里程转换为km。到目前为止,以下代码正在顺利运行:
// convert miles from string to float
var miles = (textfieldMiles.text as NSString).floatValue
// calculate kilometers
var kilometers = miles * 1.609344
// determine terminology
var termMiles = "mile"
if (miles != 1.00) {
termMiles = termMiles + "s"
}
var termKilometers = "kilometer"
if (kilometers != 1.00) {
termKilometers = termKilometers + "s"
}
// display results
labelMain.text = "\(miles) \(termMiles) = \(kilometers) \(termKilometers)"
我想显示小数点后只有两位数的结果里程/公里,所以我实现了以下内容:
// format numbers
miles = NSString(format:"%.2f", miles)
这给了我一个错误"呼叫中的额外参数"。我可以说,这是因为我在" miles"由于某种原因,不能使用NSString。我不知道如何解决这个问题,虽然我觉得以前的一些答案可能会有所帮助,但我还没有足够的背景知识来理解它们。某种灵魂可以解释解决方案是什么,对于奖励积分,为什么解决方案有效?
答案 0 :(得分:2)
啊!这是一个不正确的编译器警告的情况。 真正的问题是您尝试将String
值分配给Float
类型的变量。
尝试这样的事情:let milesString = NSString(format: "%.2f", miles)
并且您会发现它按预期工作 - 在首次声明miles
之后,您无法将NSString
重新用作Float
是miles
。
当您第一次声明Float
变量时,Swift编译器将其推断为(textfieldMiles.text as NSString).floatValue
类型,因为NSString
返回的是{{1}}。然后,当您尝试将{{1}}分配给同一个变量时,编译器放弃了,因为Swift没有为您隐式转换变量类型。这不是编译器设计的疏忽,它实际上是一个非常有用的功能 - 转换类型经常发生意外而不是故意,如果你已经认识到想要明确地转换一个类型,你可能只需要编写一些转换语法就可以了。