为什么协议中定义的覆盖方法在父 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
    }

}