1. ホーム
  2. swift

[解決済み] 型の不変値に変異型メンバを使用することはできません。

2022-02-16 13:47:56

質問

以下の構造体があります。

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
    }
}

私のクラスでは、この構造体をこのように使いたいのです。

final class SomeClass: SuperClass {
    var data: SuperModel
    init() {
        self.data = ModelOne()
    }
    func someFunc() {
        (self.data as! ModelOne).setSub(ModelOne.SubModelOne(someVar: 2, otherVar: 1))
    }
}

以下のエラーが発生します。 Cannot use mutating member on immutable value of type 'ModelOne' . なぜそうなるのでしょうか、どうすれば解決できるのでしょうか。

どのように解決するのですか?

構造体などの値型に型キャストを適用した場合、成功すれば、イミュータブルな コピー を指定します。

(self.data as! ModelOne) // this is copy of data

キャストする必要がある値を変更する唯一の方法は(私の知る限り)、値を再割り当てすることです(@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
    }
}