不能通过下标/环境键分配

问题描述

在使用 SwiftUI 开发 iOS 应用程序时,我面临以下情况。我按照我在网上的一些教程中找到的内容设置了一个自定义环境密钥。这是 SceneDelegate.swift 文件中的相关代码

    .....
    private struct RowColorMaster: EnvironmentKey {
        static let defaultValue:[[String:Color]] = [[:]]
    }

    extension EnvironmentValues {
        var rowColorMasterDico:[[String:Color]] {
            get {self[RowColorMaster.self]}
            set {self[RowColorMaster.self] = newValue}
        }
    }
    .....
    var rowColorMasterDico:[[String:Color]]
    // Initialize rowColorMasterDico:
    rowColorMasterDico = ......
    .....
    let contentView = ContentView(.....)
                            .environment(\.managedobjectContext,context)
                            .environment(\.rowColorMasterDico,rowColorMasterDico)
    .....

然后在某个文件中进一步向下查看层次结构:

    .....
    @Environment(\.rowColorMasterDico) var rowColorMasterDico
    .....

    func handleEvent(_ file: String,flag: Bool) {
        rowColorMasterDico[page.index][file] = flag ? Color.red : Color.white
    }

一开始一切似乎都很顺利,直到我遇到了 handleEvent 函数的执行,在那里我收到了这个错误消息:

    Cannot assign through subscript: 'rowColorMasterDico' is a get-only property

是否可以在我的代码修改某些内容(可能是我的自定义环境键的设置方式)以便能够通过下标进行分配?

解决方法

使您的环境对象可绑定。 这是可能的解决方案

首先进行绑定

private struct RowColorMaster: EnvironmentKey {
    static var defaultValue: Binding<[[String:Color]]> = .constant([[:]])
}

extension EnvironmentValues {
    var rowColorMasterDico: Binding<[[String:Color]]> {
        get {self[RowColorMaster.self]}
        set {self[RowColorMaster.self] = newValue}
    }
}

接下来,在你的父视图中创建一个状态变量

@State private var rowColorMasterDico:[[String:Color]] = []

var body: some Scene {
    WindowGroup {
        RootView()
            .environment(\.rowColorMasterDico,$rowColorMasterDico)
    }
}

现在,在子视图中

@Environment(\.rowColorMasterDico) var rowColorMasterDico

func handleEvent(_ file: String,flag: Bool) {
    rowColorMasterDico.wrappedValue[page.index][file] = flag ? Color.red : Color.white
}