展开可选项时出错

时间:2017-11-24 16:38:47

标签: ios swift

在下面的代码中,我从xcode收到错误说:"不能在不可变值上使用变异成员:' fahrenheitValue'是一个“让...” 。恒定"

此代码示例来自iOS第6版的The Big Nerd Ranch Guide。 部分原因是没有真正理解为什么这本书会出错,我理解错误的含义,但我不知道如何解决这个问题...

有人可以告诉我这里我做错了吗?

import UIKit

class ConversionViewController: UIViewController {
    @IBOutlet var celsiusLabel: UILabel!
    var fahrenheitValue: Measurement<UnitTemperature>? {
        didSet {
            updateCelsiusLabel()
        }
    }
    var celsiusValue: Measurement<UnitTemperature>? {
        if let fahrenheitValue = fahrenheitValue {
            return fahrenheitValue.convert(to: .celsius)
        }else{
            return nil
        }
    }
}

2 个答案:

答案 0 :(得分:6)

rmaddy described问题的根源,你试图在本地let常量上调用变异函数,而你应该调用converted来返回转换后的值而不是试图改变现有的价值。

但我可能会建议使用可选链接进一步简化:

var celsiusValue: Measurement<UnitTemperature>? {
    return fahrenheitValue?.converted(to: .celsius)
}

如果nilfahrenheitValue,则会自动返回nil,否则将返回converted(to:)来电的值。

答案 1 :(得分:5)

问题在于这两行:

if let fahrenheitValue = fahrenheitValue {
    return fahrenheitValue.convert(to: .celsius)

您无法在convert(to:)上致电fahrenheitValue,因为fahrenheitValue是常量而convert(to:)正在尝试修改该常量,因此错误。

解决方案是将convert(to:)替换为converted(to:)。前者不返回任何内容并试图修改接收器。后者创建一个新的度量并返回新值。这就是你想要的。

return fahrenheitValue.converted(to: .celsius)