我有以下 struct :

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

在我的课堂上,我想这样使用这个 struct :

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'.为什么会这样?我该如何解决这个问题?

推荐答案

当您对值类型(如 struct )应用类型转换时,如果成功,您将收到请求值的不可变copy:

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

Swift相关问答推荐

macOS托盘应用程序中的列表显示奇怪

如何使用RxSwift根据数据数绘制UICollectionView单元格

SwiftUI状态更新

绑定到可选值的非可选属性?'

如何将图像插入到矩形中

在数组中查找最大y值的x值

Swift中从头开始的基本HTTP客户端

解码器是否需要具有密钥的外部数据表示?

如何使用模型在 SwiftUI 的列表中进行搜索

SwiftUI如何能够在Text中使用字符串字面量来创建LocalizedStringKey?

创建 ViewModel 时 iOS 模拟器上的黑屏

使用列表的下一项更新相同的视图

单击按钮后的计时器发布者初始化计时器

为什么 swift 中的类没有存储类型属性?

使用 Swift 在 iOS 8 中为应用程序图标添加徽章

如何在 Swift 中遍历 struct 属性?

快速覆盖属性

iOS 视图可见性消失了

swift - 我可以从我的自定义初始化方法中调用 struct 默认成员初始化吗?

使用 swift IOS 使 UIBarButtonItem 消失