很抱歉,但这很琐碎,但我还没有完全了解KeyPath。我有一个类(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元素,另一个要针对Settings类中两个属性之一的KeyPath。在运行时,程序将确定必须修改数组的哪个元素和哪个属性。
我可以读取该属性(在我的示例中,通过:let target = myClass [keyPath:kp] [0] [keyPath:kp2 [0]]),但是我无法通过尝试修改它来修改它:myClass [keyPath:kp] [0] [keyPath:kp2 [0]] =128。我收到一个错误:无法通过下标分配:“ myClass”是不可变的。
我不确定这些部分键路径与数组的相互作用。我们将不胜感激如何解决此问题的任何帮助(即,能够以这种方式在“设置”中修改属性)。