【问题标题】:Variable was never mutated变量从未发生变异
【发布时间】:2015-07-08 11:18:11
【问题描述】:

我一直在关注制作简单临时转换应用的应用教程,

我有如下几行代码

    // get the users imput : c
    var celsius:Int = celsiusValue.text.toInt()!

    //formula : c to f
    // 5f = 9c + 160

    // output : f
    var fah:Int = ( 9 * celsius + 160 ) / 5

    print(fah)

我遇到了一些错误,我不明白为什么会这样,

“String”没有名为“Int”的成员

这意味着 Int 不能使用,因为显示的字符串中没有整数?

可选类型“字符串?”的值未拆封;你的意思是用 '!'还是“?”?

我已将代码更改为

var celsius:Int = celsiusValue.text!.toInt()!

正如它在错误帮助程序中显示的那样,但它仍然给我与

相同的错误

可选类型“字符串?”的值未拆封;你的意思是用 '!'还是“?”?

所以现在我对此感到困惑,我已经阅读了有关该变量从未发生突变的其他线程,但它似乎并没有帮助我了解它发生了什么

【问题讨论】:

  • 请说明celsiusValue是什么类型
  • 这是我认为你要求 @IBOutlet var celsiusValue: UITextField 的一段代码!

标签: swift


【解决方案1】:

评论太长了...

"variable was never mutated" 在 Swift 中不是致命错误。它更像是一个指导方针,也是一个非常烦人的指导方针。每次你创建一个新变量时它都会这样说,因为你还没有改变它。 Xcode 希望你将所有非变异的东西写成带有let 的常量。

可选类型“字符串?”的值未拆封;你的意思是用'!'或者 '?'? 这是一个非常重要的问题,您可以在 SO 上找到数以千计的问题。 Swift 有可选项,这意味着它可以保存一个值,也可以什么都不保存。然后它将为零。这可能会导致错误,这就是您使用“!”的原因。和 ”?”。如果您使用“!”声明或打开包装结果将被处理,就像它不是可选的一样。它可能仍然是 nil,但不会检查它是否为 nil。如果您想让它更模糊,请使用“?”这样,Xcode 会不断警告您正在使用可选项。

但是关于这个以及如何使用可选代码编写代码的更多信息可以通过 google/SO 找到。

至于字符串 => 整数。如果我没记错的话,这只适用于 NSStrings。所以确保你在那里得到一个 NSString 。否则,您必须将其转换为 NSString。

【讨论】:

    【解决方案2】:

    如果用户输入不能转换为Int(例如:“foo”),您的代码将会崩溃

    您可能更喜欢按如下方式重写代码:

    if let celsius = celsiusValue.text.toInt() {
    
        //formula : c to f
        // 5f = 9c + 160
    
        // output : f
    
        let fah: Double = ( 9 * Double(celsius) + 160 ) / 5
    
        print(fah)
    
    } else {
        // Handle Error
    }
    

    请注意,我选择 fah 作为 Double ... 只是为了提高精度,而不是出于特定于您的问题的原因。

    还要注意在这种情况下如何不需要使用var。类似的情况在 Swift 中很常见并且受到鼓励(就像在其他语言中一样)。

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-17
      • 1970-01-01
      • 2018-01-03
      • 1970-01-01
      • 1970-01-01
      • 2016-08-21
      • 1970-01-01
      • 2020-07-08
      相关资源
      最近更新 更多