Очень мило, спасибо @Hamish!
зи смой предыдущий вопросовЯ решил подклассNSArrayController
для того, чтобы достичь желаемого поведения.
class NSPresetArrayController: NSArrayController {
override func addObject(_ object: Any) {
if let preset = object as? Preset {
super.addObject(["name": preset.name, "value": preset.value])
} else {
super.addObject(object)
}
}
}
Это работает, но что, если я хотел что-то, что работает для любогоEncodable
класс, а не только один с двумя свойствами под названиемname
а такжеvalue
?
По сути, проблема заключается в создании словаря из класса, где ключами являются имена свойств, а значениями являются значения этих свойств.
Я пытался написать что-то вроде этого:
class NSPresetArrayController: NSArrayController {
override func addObject(_ object: Any) {
if let encodableObject = object as? Encodable {
let data = try! PropertyListEncoder().encode(encodableObject)
let any = try! PropertyListSerialization.propertyList(from: data, options: [], format: nil)
super.addObject(any)
}
}
}
Тем не менее, я получаю ошибку компиляции:
Cannot invoke 'encode' with an argument list of type '(Encodable)'
1. Expected an argument list of type '(Value)'
Как мне это исправить, чтобы он компилировался?