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

问题描述:

我按照Swift 1.2的一本书[1]上的说明来学习如何使用一个文本字段,一个按钮和一个结果标签来制作一个简单的温度转换应用程序。我正在使用Swift 3.你在文本字段中输入温度,按下“Convert”按钮,你应该得到结果,但是我得到“不能转换类型'String'的值?'在强制中键入'NSString'。转换'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 

但我仍然收到了警告:‘串’“从演员到不相关的类型'NSString'总是失败“。

Swift 3应该怎么做?

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

+5

继一书,对雨燕1.2将会给你带来远远更多的问题比它的价值。 Swift 4将在几周内出现(测试版)。做你自己的忙,并找到为Swift 3编写的教程。 – rmaddy

+1

为什么任何人在编写Swift 3时都会尝试使用Swift 1.2的书?这些是完全不同的语言! – matt

+0

'let fahrenheit = Double(tempText.text)'?看到这里:https://*.com/questions/40372656/convert-optional-string-to-double-in-swift-3 – Larme

一个类型转换为NSString得到一个Double是一个非常不好的习惯(即使在Swift 1中)。

一个安全的斯威夫特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" 
    } 
} 
+0

这也适用。谢谢! – tomihasa

+0

@tomihasa请注意,这个答案比你在最后一个评论下面提到的两行要好得多。当用户输入的值不是有效数字时,此代码不会崩溃。 – rmaddy