0

抱歉,如果这是微不足道的,但我还没有完全理解 KeyPaths。我有一个类(ContainerClass),其中有一个类数组(mySettings)。mySettings 类有两个变量(颜色和名称)。mySettings 的数组是在运行时定义的。我正在尝试通过 KeyPaths 修改 mySettings 类中的属性。以下代码是我想要实现的简化版本:

import Cocoa
import Foundation


class Settings {

    var color: Int?
    var name: String?

    init(color: Int, name: String)    {

        self.color = color
        self.name = name
    }
}

class ContainerClass    {

    var mySettings = [Settings]()
}


var myClass = ContainerClass()

let kp = \ContainerClass.mySettings
let kp2 = [\Settings.color, \Settings.name]

myClass.mySettings.append(Settings(color: 1, name: "One"))
myClass.mySettings.append(Settings(color: 2, name: "Two"))
myClass.mySettings.append(Settings(color: 3, name: "Three"))
myClass.mySettings.append(Settings(color: 4, name: "Four"))
myClass.mySettings.append(Settings(color: 5, name: "Five"))


for index in 0..<myClass.mySettings.count   {
    print(myClass.mySettings[index].color!)
}

let target = myClass[keyPath: kp][0][keyPath: kp2[0]]

print("\ntarget:", target as! Int)

myClass[keyPath: kp][0][keyPath: kp2[0]] = 128      // ERROR: Cannot assign through subscript: 'myClass' is immutable

for index in 0..<myClass.mySettings.count   {
    print(myClass.mySettings[index].color!)
}

我需要两个单独的 KeyPath:一个用于定位 ContainerClass 中包含的数组的一个特定 mySettings 元素,另一个 KeyPath 用于定位 Settings 类中的两个属性之一。在运行时,程序将确定数组的哪个元素以及必须修改的属性。

我可以读取属性(在我的示例中,通过:let target = myClass[keyPath: kp][0][keyPath: kp2[0]]),但我无法通过尝试修改它,例如:myClass[ keyPath: kp][0][keyPath: kp2[0]] = 128。我收到一个错误:无法通过下标分配:'myClass' 是不可变的。

我不确定这些部分键路径与数组的交互。任何有关如何解决此问题的帮助(即能够以这种方式修改设置中的属性)将不胜感激。

4

0 回答 0