为什么协议中定义的覆盖方法在父 class 中被调用而不是在子 class 中被调用?
Why does an override method defined in a protocol get called in the parent class and not it's subclass?
我有一个协议:
public protocol JSONMapper {
func map(fromJSON json:JSON) -> Self
}
还有一个 class 模型,我所有的模型对象都继承自:
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
...从 "Workout" class 中调用:
if let workouts = Workout.instances(fromJSON: items.arrayValue) as? [Workout] {
self.workouts = workouts
}
但事实并非如此。被调用的函数是父函数,在 "Model" class.
中定义
我也试图明确地使 "Workout" class 符合 JSONMapper 协议,但没有成功。
谢谢!
编辑:
上述问题的 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
”class 方法中显式调用了“Model
”class 的初始化程序。您应该改用“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
}
}
我有一个协议:
public protocol JSONMapper {
func map(fromJSON json:JSON) -> Self
}
还有一个 class 模型,我所有的模型对象都继承自:
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
...从 "Workout" class 中调用:
if let workouts = Workout.instances(fromJSON: items.arrayValue) as? [Workout] {
self.workouts = workouts
}
但事实并非如此。被调用的函数是父函数,在 "Model" class.
中定义我也试图明确地使 "Workout" class 符合 JSONMapper 协议,但没有成功。
谢谢!
编辑:
上述问题的 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
”class 方法中显式调用了“Model
”class 的初始化程序。您应该改用“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
}
}