如何在swift3中编写NSNumber?

问题描述 投票:2回答:4
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'。需要帮助解决问题。

swift
4个回答
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'Joel Bell有正确的答案。这是我的方法

func updateCelsiuslabel() {
    if let value = celsiusValue {
        celsiusLabel.text = numberFormatter.string(from: NSNumber(value: value))
    }
    else {
        celsiusLabel.text = "???"
    }
}

我希望有所帮助。


1
投票

函数stringFromNumber期望你传递一个NSNumber对象,但是你试图传递一个Double。所以你需要像这样包装你的Double:

let myNumber = NSNumber(value: value)
celsiusLabel.text = numberFormatter.string(from: myNumber)

我也相信它应该是

.decimal

代替

.decimalStyle

注意:这可能会略有不同,具体取决于您使用的swift版本。


0
投票

编辑:这是Swift 2,这对你不起作用,因为你使用的是Swift 3.我会留下答案以防万一它需要

你的第一个错误是因为NumberFormatter期望一个NSNumber作为一个参数,你传递给它一个双。尝试

celsiusLabel.text = numberFormatter.stringFromNumber(NSNumber(double: value))

你的第二个错误是因为NumberFormatter.Style中没有decimalStyle,但是有一个小数,所以试试吧

nf.numberStyle = .decimal

Here是所有可用的风格选项


0
投票

这是一个Swift 2到Swift 3的转换错误。为早期版本的Swoft编写的许多书籍现已过时 - 它们无法跟上Swift版本的年度变化。斯威夫特的发展速度超过作者可以跟上的速度。

© www.soinside.com 2019 - 2024. All rights reserved.