这是问题的扩展:creating-a-function-on-a-parent-class-that-can-be-accessible-to-all-its-children
有人建议不要使用函数类,协议会更好。在尝试协议方法后,发生错误“协议类型'JSONObject'无法实例化”。任何帮助修复此错误表示赞赏。这是协议:
protocol JSONObject: class, NSObjectProtocol {
init(resultsDictionary: [String:Any])
}
extension JSONObject {
static func updateResultsDictionary(urlExtension: String, completion:
@escaping (JSONObject?) -> Void) {
let nm = NetworkManager.sharedManager
_ = nm.getJSONData(urlExtension: urlExtension) {data in
guard let jsonDictionary = nm.parseJSONFromData(data),
let resultDictionaries = jsonDictionary["result"] as? [[String : Any]] else {
completion(nil)
return
}
for resultsDictionary in resultDictionaries {
let jsonInfo = JSONObject(resultsDictionary: resultsDictionary)// Error haapens here
completion(jsonInfo)
}
}
}
}
答案 0 :(得分:1)
像这样使用Self
:
static func updateResultsDictionary(urlExtension: String, completion:
@escaping (Self?) -> Void) {
let jsonInfo = self.init(resultsDictionary: [:])
completion(jsonInfo)
}
因为您无法初始化某些protocol
,但您可以初始化Type
符合protocol
。
Self
表示Type
而不是protocol
。
这是一个关于Protocol-Oriented Programming in Networking的教程,它将帮助您设计网络架构。