我正在寻找一种坚持任意子类的好方法。
我在保存时编写对象asDictionary
to json,在加载时编写init(json)
them back。结构为Group
,其Unit
种类不同。 Group
仅将其单位视为实施UnitProtocol
的内容。
UA
的子类Unit
等与单元具有完全相同的数据。因此数据方面,asDictionary
和init(json)
非常适合Unit
。子类仅在逻辑上有所不同。所以当从文件中恢复它们时,我相信它必须是初始化的确切子类。
[UnitProtocol]
,而是[UA]
,[UB]
等,可以单独保存,恢复按其各自的子内容,并在初始化时合并为[UnitProtocol]
。Unit.Init(json)
,以某种方式能够根据子类型传递初始化。答案 0 :(得分:1)
对于json的init类,我使用了这个技术:
//For row in json
for row in json {
//namespace it use for init class
let namespace = (Bundle.main.infoDictionary!["CFBundleExecutable"] as! String).replacingOccurrences(of: " ", with: "_")
//create instance of your class
if let myClass = NSClassFromString("\(namespace).\(row.name)") as? NameProtocol.Type{
//init your class
let classInit : NameProtocol = myClass.init(myArgument: "Hey")
//classInit is up for use
}
}
答案 1 :(得分:1)
将每个单元json存储为其类名
var server *http.Server
//...
func PleaseStart() {
http.HandleFunc("/", handlerfunc)
server = &http.Server{
Addr: ":80",
Handler: http.DefaultServeMux,
}
log.Fatal(server.ListenAndServe())
}
func kill_server() {
server.Close()
}
使用@ horusdunord的解决方案从json初始化:
func asDictionary() -> Dictionary<String, Any> {
let className = String(describing: type(of: self))
let d = Dictionary<String, Any>(
dictionaryLiteral:
("className", className),
("someUnitData", someUnitData),
// and so on, for all the data of Unit...
这里的诀窍是将类for unitJson in unitsJson {
let className = (unitJson as! [String: Any])["className"] as? String
let namespace = (Bundle.main.infoDictionary!["CFBundleExecutable"] as! String).replacingOccurrences(of: " ", with: "_")
if let unitSubclass = NSClassFromString("\(namespace).\(className ?? "N/A")") as? UnitProtocol.Type {
if let unit = unitSubclass.init(json: unitJson as! [String : Any]) {
units.append(unit)
} else {
return nil
}
} else {
return nil
}
}
转换为unitSubclass
然后允许您调用在该协议中声明的UnitProtocol
,但在特定子类或其超类{{}中实现1}},如果属性都相同。