swift - 为什么在协议(protocol)中定义的重写方法会在父类中调用,而不是在子类中调用?

标签 swift oop subclass

我有一个协议(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/

相关文章:

java : Function objects as strategies

JavaScript 对象关联

java - 父类(super class)对象还是子类对象?为什么?

python - python抽象基类的惯用多重继承

ios - Realm 无法在后台线程中解密数据库错误

c# - 返回接口(interface)类型列表

ios - PaypalMobile 在授权意图上抛出错误

cocoa - 未在 PDFView 子类上调用 drawRect

ios - 如何从查询传递数据 - Swift 和 Parse

swift - 无法将 UICollectionViewCell 集中在 UITableViewCell 中