Извиняюсь, если это тривиально, но я еще не полностью изучил KeyPaths.У меня есть класс (ContainerClass), в котором есть массив классов (mySettings).Класс mySettings имеет две переменные (цвет и имя).Массив mySettings определяется во время выполнения.Я пытаюсь изменить свойства в классе mySettings через KeyPaths.Следующий код является упрощенной версией того, что я пытаюсь достичь:
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: один для нацеливания на один конкретный элемент mySettings массива, содержащегося в ContainerClass, и другой KeyPath для нацеливания одногоиз двух свойств в классе настроек.Во время выполнения программа определит, какой элемент массива и какое свойство необходимо изменить.
Я могу прочитать свойство (в моем примере это так: let target = myClass [keyPath: kp] [0] [keyPath: kp2 [0]]), но я не могу изменить его, попробовав, например, такую строку: myClass [keyPath: kp] [0] [keyPath: kp2 [0]] = 128. Я получаю ошибку: Невозможно назначитьчерез нижний индекс: 'myClass' является неизменным.
Я не уверен насчет взаимодействия этих частичных путей к массивам.Будем весьма благодарны за любую помощь в том, как решить эту проблему (например, возможность изменить свойства в Настройках).