在下面的代码中,我从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
}
}
}
答案 0 :(得分:6)
rmaddy described问题的根源,你试图在本地let
常量上调用变异函数,而你应该调用converted
来返回转换后的值而不是试图改变现有的价值。
但我可能会建议使用可选链接进一步简化:
var celsiusValue: Measurement<UnitTemperature>? {
return fahrenheitValue?.converted(to: .celsius)
}
如果nil
为fahrenheitValue
,则会自动返回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)