В связи с my предыдущими вопросами я решил создать подкласс 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)'
Как это исправить, чтобы он компилировался?