Смешивание частичных ключей и массивов в Swift - PullRequest
0 голосов
/ 24 июня 2019

Извиняюсь, если это тривиально, но я еще не полностью изучил 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' является неизменным.

Я не уверен насчет взаимодействия этих частичных путей к массивам.Будем весьма благодарны за любую помощь в том, как решить эту проблему (например, возможность изменить свойства в Настройках).

...