转换'String?'类型的值输入'NSString'

时间:2017-08-16 19:23:35

标签: swift

我按照Swift 1.2的书[1]上的说明,如何使用一个文本字段,一个按钮和一个标签来制作一个简单的温度转换应用程序。我正在使用Swift 3.您在文本字段中键入温度,按“转换”按钮,您应该得到结果,但我得到“无法转换类型'String的值?'在强制中输入'NSString'。

import UIKit

class ViewController : UIViewController {

    @IBOutlet weak var tempText : UITextField!

    @IBOutlet weak var resultLabel : UILabel!

    override func viewDidLoad() {

        super.viewDidLoad()
    }

    @IBAction func convertTemp( _ sender: Any ) {

        let fahrenheit      = ( tempText.text as NSString ).doubleValue
        let celsius         = ( fahrenheit - 32 ) / 1.8
        let resultText      = "Celsius \(celsius)"
        resultLabel.text    = resultText
    }

    override func didReceiveMemoryWarning() {

        super.didReceiveMemoryWarning()
    }
}

我可以添加一个感叹号,如下所示:

    let fahrenheit      = ( tempText.text as! NSString ).doubleValue

但是我仍然会收到警告:“从'String?'中演员?不相关的类型'NSString'总是失败“。

如何在Swift 3中完成这项工作?

[1] Neil Smyth。 2015. iOS 8 App Development Essentials - 第二版:学习使用Xcode和Swift 1.2开发iOS 8应用程序。 ISBN 978-1511713337。

1 个答案:

答案 0 :(得分:3)

强制转换为NSString以获得Double的类型是一个非常糟糕的习惯(即使在Swift 1中)。

一个安全的Swift 3解决方案是可选地绑定text属性和Double转换

@IBAction func convertTemp(_ sender: Any ) {

    if let degrees = tempText.text, let fahrenheit = Double(degrees) {
        let celsius         = ( fahrenheit - 32 ) / 1.8
        let resultText      = "Celsius \(celsius)"
        resultLabel.text    = resultText
    } else {
        resultLabel.text    = "Conversion failed"
    }
}