Как установить значение атрибута, в котором сам атрибут является переменным в Swift

#ios #swift #core-data #tableview

#iOS #swift #core-data #просмотр таблицы

Вопрос:

У меня есть TableView с двумя столбцами — name и value, где name — это само имя атрибута для экземпляра класса объекта из CoreData. А значение — это текстовое поле, которое является значением или этим атрибутом, и я хочу, чтобы пользователь мог редактировать его в tableview.

У меня есть имена свойств и отдельно значения, каждое из которых хранится в отдельном массиве. Итак, у меня есть propertyArray и valueArray, и порядок массивов соответствует парам ключей.

Таким образом, я, безусловно, могу определить, какое свойство редактируется на основе indexPath , но у меня возникли проблемы с выяснением, как изменить фактическое значение свойства на то, что недавно введено в текстовое поле.

Логика в том, что мне нужно :

 animal.(propertyArray[IndexPath.row]) = textField.text
  

есть ли у меня способ создать строковую переменную «animal.whateverTheAttributeIs» и каким-то образом преобразовать ее в левую часть этого уравнения?

Комментарии:

1. Я предполагаю, что у вас есть только один экземпляр объекта core data в вашем табличном представлении, а затем x количество атрибутов, то есть строк, для этого экземпляра?

2. да, это совершенно верно.

3. Затем у вас есть атрибуты в определенном порядке, поэтому вам следует создать простое сопоставление между номером строки и свойством.

4. да, у меня данные упорядочены правильно. Я не знаю о сопоставлении, так что это то, что я могу исследовать. Я могу получить доступ ко всем отдельным точкам данных, которые мне нужны для формирования уравнения настройки animal.property но как мне указать animal.x = «Spot» или animal.x = «Male», где x изменяется от строки к строке? У меня есть буквальное строковое представление x, но я не знаю, как включить это в само уравнение, чтобы установить новое значение свойства.

5. Используйте setValue:forKeyPath: .

Ответ №1:

У вас может быть словарь, который содержит сопоставление между номерами строк и свойствами, используя keyPath

 struct Example {
    var id: String
    var name: String
    var text: String
}

let rowMap: [Int: WritableKeyPath<Test, String>] = [0: .id, 1: .name, 2: .text]
  

а затем вы просматриваете словарь, чтобы получить правильный путь к ключу из строки

 if let keypath = rowMap[indexPath.row] {
    exampleObject[keyPath: keypath] = "some value"
}
  

или для подкласса NSObject (которым является ваш класс), который вы можете использовать setValue:forKeyPath , как указано в комментариях

 if let keypath = rowMap[indexPath.row] {
    exampleObject.setValue("some value", forKeyPath: keypath)
}
  

Это несколько упрощено, поскольку я предполагаю из ваших примеров, что все свойства имеют тип String