func updateCelsiusLabel() {
if let value = celsiusValue {
celsiusLabel.text = numberFormatter.stringFromNumber(value)
}
else {
celsiusLabel.text = "???"
}
}
let numberFormatter: NumberFormatter = {
let nf = NumberFormatter()
nf.numberStyle = .DecimalStyle
nf.minimumFractionDigits = 0
nf.maximumFractionDigits = 1
return nf
}()
我正在编写代码,为我的iphone应用程序创建一个摄氏格式。我需要它来处理将数字转换为小数位。
我从我的xcode编译器得到两个错误。无法将'Double'类型的值转换为预期的参数类型'NSNumber'。另一个问题,类型'NumberFormatter.Style'没有成员'DecimalStyle'。需要帮助解决问题。
仅供参考,正在构建的应用程序是从优秀的书“IOS编程:大书呆子牧场指南”第4章开始练习。
问题2首先:“类型'NumberFormatter.Style'没有成员'DecimalStyle'”Swift 3或Xcode 8已经为NumberFormatter折旧NSNumberFormatter,它使代码更容易阅读。您的代码应该以这种方式工作
let numberFormatter: NumberFormatter = {
let nf = NumberFormatter()
nf.numberStyle = .decimal
nf.minimumFractionDigits = 0
nf.maximumFractionDigits = 1
return nf
}()
问题1:无法将'Double'类型的值转换为预期的参数类型'NSNumber'Joel Bell有正确的答案。这是我的方法
func updateCelsiuslabel() {
if let value = celsiusValue {
celsiusLabel.text = numberFormatter.string(from: NSNumber(value: value))
}
else {
celsiusLabel.text = "???"
}
}
我希望有所帮助。
函数stringFromNumber期望你传递一个NSNumber对象,但是你试图传递一个Double。所以你需要像这样包装你的Double:
let myNumber = NSNumber(value: value)
celsiusLabel.text = numberFormatter.string(from: myNumber)
我也相信它应该是
.decimal
代替
.decimalStyle
注意:这可能会略有不同,具体取决于您使用的swift版本。
编辑:这是Swift 2,这对你不起作用,因为你使用的是Swift 3.我会留下答案以防万一它需要
你的第一个错误是因为NumberFormatter期望一个NSNumber作为一个参数,你传递给它一个双。尝试
celsiusLabel.text = numberFormatter.stringFromNumber(NSNumber(double: value))
你的第二个错误是因为NumberFormatter.Style中没有decimalStyle,但是有一个小数,所以试试吧
nf.numberStyle = .decimal
Here是所有可用的风格选项
这是一个Swift 2到Swift 3的转换错误。为早期版本的Swoft编写的许多书籍现已过时 - 它们无法跟上Swift版本的年度变化。斯威夫特的发展速度超过作者可以跟上的速度。