这就是我所拥有的:
struct Vector { var x: Double = 0.0 { didSet { magnitudeActual = -1.0 } } var y: Double = 0.0 { didSet { magnitudeActual = -1.0 } } var magnitudeActual: Double = 0.0 var magnitude: Double { if magnitudeActual < 0.0 { magnitudeActual = sqrt(x * x + y * y) //cannot assign to "magnitudeActual" in self } return magnitudeActual } init() {} init(_ x: Double,_ y: Double) { self.x = x self.y = y } }
解决方法
Modifying Value Types from Within Instance Methods
Structures and enumerations are value types. By default,the properties of a value type cannot be modified from within its instance methods.
However,if you need to modify the properties of your structure or enumeration within a particular method,you can opt in to mutating behavior for that method. The method can then mutate (that is,change) its properties from within the method,and any changes that it makes are written back to the original structure when the method ends. The method can also assign a completely new instance to its implicit self property,and this new instance will replace the existing one when the method ends.
那么,除非执行修改的函数被标记为变异,否则结构不能自行修改.这意味着您需要为属性定义正确的get函数.
var magnitude: Double { mutating get { if magnitudeActual < 0.0 { NSLog("Recalc") // just to make sure it's caching the result properly. magnitudeActual = sqrt(x * x + y * y) } return magnitudeActual } }
现在我们可以做到这一点
var v = Vector(3,4) v.magnitude // Recalc 5 v.magnitude // 5 v.x = 5 v.y = 12 v.magnitude // Recalc 13
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。