在Swift中混合部分KeyPath和数组

时间:2019-06-24 05:42:26

标签: arrays swift keypaths

很抱歉,但这很琐碎,但我还没有完全了解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”是不可变的。

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

0 个答案:

没有答案