【发布时间】:2019-01-27 20:06:17
【问题描述】:
关于mypreviousquestions,我决定继承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)'
如何解决这个问题以便编译?
【问题讨论】:
-
这归结为将对象从
Any转换为“真实”类型......但老实说我不知道该怎么做。不过,我敢肯定有人会这样做。假设这是可能的。 -
您无法解决此问题。
encode的参数必须是具体类型,而不是协议。与 Objective-C 和 Swift 泛型广泛相关的 Cocoa 绑定不能一起工作。你必须找到一种没有绑定或没有泛型的方法。 -
好吧,你可以静态枚举你将要编码的类型...... :barf:
标签: swift serialization codable