我有以下结构:
public protocol SuperModel {
// empty protocol
}
struct ModelOne: SuperModel {
struct SubModelOne {
var someVar: Double
var othervar: Double?
}
var sub: SubModelOne?
mutating func setSub(sub: SubModelOne) {
self.sub = sub
}
}
Run Code Online (Sandbox Code Playgroud)
在我的课上,我想使用这样的结构:
final class SomeClass: SuperClass {
var data: SuperModel
init() {
self.data = ModelOne()
}
func someFunc() {
(self.data as! ModelOne).setSub(ModelOne.SubModelOne(someVar: 2, otherVar: 1))
}
}
Run Code Online (Sandbox Code Playgroud)
我得到以下错误:Cannot use mutating member on immutable value of type 'ModelOne'
.为什么会这样,我该如何解决这个问题呢?
Sha*_* Of 27
将类型转换应用于值类型(如结构)时,如果成功,则会收到请求值的不可变副本:
(self.data as! ModelOne) // this is copy of data
Run Code Online (Sandbox Code Playgroud)
唯一的方法(我知道)如何改变需要转换的值 - 重新分配值(因为@Sahil Beri指出你需要声明变量):
func someFunc() {
if var data = data as? ModelOne {
data.setSub(ModelOne.SubModelOne(someVar: 2, otherVar: 1))
self.data = data // you can do this since ModelOne conforms to SuperModel
}
}
Run Code Online (Sandbox Code Playgroud)