抱歉,如果这是微不足道的,但我还没有完全理解 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' 是不可变的。
我不确定这些部分键路径与数组的交互。任何有关如何解决此问题的帮助(即能够以这种方式修改设置中的属性)将不胜感激。