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'。另一个问题,Type' NumberFormatter.Style'没有会员' DecimalStyle' 。需要帮助解决问题。
答案 0 :(得分:5)
仅供参考,正在构建的应用程序是从优秀的书“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' 乔尔贝尔有正确的答案。这是我的方法
func updateCelsiuslabel() {
if let value = celsiusValue {
celsiusLabel.text = numberFormatter.string(from: NSNumber(value: value))
}
else {
celsiusLabel.text = "???"
}
}
我希望有所帮助。
答案 1 :(得分:1)
函数stringFromNumber期望你传递一个NSNumber对象,但是你试图传递一个Double。所以你需要像这样包装你的Double:
let myNumber = NSNumber(value: value)
celsiusLabel.text = numberFormatter.string(from: myNumber)
我相信它应该只是
.decimal
而不是
.decimalStyle
注意:这可能会略有不同,具体取决于您使用的swift版本。
答案 2 :(得分:0)
编辑:这是Swift 2,这对你不起作用,因为你正在使用Swift 3.我会留下答案,以防万一需要
你的第一个错误是因为NumberFormatter期望一个NSNumber作为一个参数而你将它传递给它。尝试
celsiusLabel.text = numberFormatter.stringFromNumber(NSNumber(double: value))
你的第二个错误是因为NumberFormatter.Style中没有decimalStyle,但是有一个小数,所以试试
nf.numberStyle = .decimal
Here是所有可用的样式选项
答案 3 :(得分:0)
这是一个Swift 2到Swift 3的转换错误。为早期版本的Swoft编写的许多书籍现已过时 - 它们无法跟上Swift版本的年度变化。斯威夫特的发展速度比作者能跟上的速度要快。