【问题标题】:Convert value of type 'String?' to type 'NSString'转换类型“字符串?”的值输入“NSString”
【发布时间】:2017-08-16 19:23:35
【问题描述】:

我按照 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] 尼尔·史密斯。 2015. iOS 8 App Development Essentials - Second Edition:学习使用 Xcode 和 Swift 1.2 开发 iOS 8 应用程序。国际标准书号 978-1511713337。

【问题讨论】:

  • 跟随一本关于 Swift 1.2 的书会给你带来更多的问题而不是它的价值。 Swift 4 将在几周后发布(现在是测试版)。帮自己一个大忙,找到为 Swift 3 编写的教程。
  • 在编写 Swift 3 时,为什么有人会尝试使用 Swift 1.2 的书?这些是完全不同的语言!
  • let fahrenheit = Double(tempText.text)?见那里:stackoverflow.com/questions/40372656/…
  • 你真的应该找到一本关于 Swift 3 甚至 Swift 4 的书(这些书很快就会面世)
  • 你可以做Double(tempText.text!)!。或者,更安全的guard let string = tempText.text, let fahrenheit = Double(string) else { return }

标签: swift


【解决方案1】:

将类型转换为 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"
    }
}

【讨论】:

  • @tomihasa 请注意,这个答案比您在问题下方的最后评论中提到的两行要好得多。当用户输入的值不是有效数字时,此代码不会崩溃。
猜你喜欢
  • 1970-01-01
  • 2016-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-02
  • 2021-08-27
  • 1970-01-01
相关资源
最近更新 更多