我有一个协议(protocol):
public protocol JSONMapper {
func map(fromJSON json:JSON) -> Self
}
还有一个模型类,我的所有模型对象都继承自:
class Model: JSONMapper {
func map(fromJSON json: JSON) -> Self {
return self
}
class func instances (fromJSON json:[JSON]) -> [AnyObject] {
var objects = [Model]()
for item in json {
objects.append( Model().map(fromJSON: item) )
}
return objects
}
}
一个例子是:
class Workout: Model {
var uniqueID: String?
override func map(fromJSON json: JSON) -> Self {
if let value = json["UniqueID"].string { self.uniqueID = value }
return self
}
}
从上面来看,我期望这个功能
fun map(fromJSON json:JSON) -> Self
...执行此操作时从“锻炼”类调用:
if let workouts = Workout.instances(fromJSON: items.arrayValue) as? [Workout] {
self.workouts = workouts
}
但事实并非如此。调用的函数是来自父级的函数,在“Model”类中定义。
我还尝试显式地使“Workout”类符合 JSONMapper 协议(protocol),但没有成功。
谢谢!
编辑:
上述问题的 Playground 示例:
import Foundation
public protocol JSONMapper {
func map(fromJSON json:AnyObject) -> Self
}
class Model: JSONMapper {
func map(fromJSON json: AnyObject) -> Self {
println(" model: \(self)") // Outputs: " model: __lldb_expr_83.Model"
return self
}
class func instances (fromJSON json:[AnyObject]) -> [AnyObject] {
var objects = [AnyObject]()
for item in json {
objects.append( Model().map(fromJSON: item) )
}
return objects
}
}
class Workout: Model, JSONMapper {
var uniqueID: String?
override func map(fromJSON json: AnyObject) -> Self {
println(" model: \(self)")
return self
}
}
Workout.instances(fromJSON: [""]) // outputs: [__lldb_expr_83.Model]
最佳答案
您正在“instances
”类方法内显式调用“Model
”类的初始值设定项。您应该使用“self
”来代替,但要使其正常工作,必须存在必需的初始值设定项。像这样的事情:
class Model: JSONMapper {
required init() {
}
func map(fromJSON json: AnyObject) -> Self {
println(" model: \(self)")
return self
}
class func instances (fromJSON json:[AnyObject]) -> [AnyObject] {
var objects = [AnyObject]()
for item in json {
objects.append( self().map(fromJSON: item) )
}
return objects
}
}
关于swift - 为什么在协议(protocol)中定义的重写方法会在父类中调用,而不是在子类中调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29892064/