如何在swift3中编写NSNumber?

时间:2016-11-04 18:09:47

标签: swift

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' 。需要帮助解决问题。

4 个答案:

答案 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版本的年度变化。斯威夫特的发展速度比作者能跟上的速度要快。