不能在类型的不可变值上使用变异成员

j0h*_*n3s 23 struct swift

我有以下结构:

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)