2015-04-27 24 views
2

我有一个协议:为什么协议中定义的重写方法在父类中被调用,而不是它的子类?

public protocol JSONMapper { 
    func map(fromJSON json:JSON) -> Self 
} 

和A类模式,我所有的模型对象继承:

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协议一致,但没有成功。

谢谢!

编辑:问题的

操场例如以上:

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] 

回答

2

你被明确呼吁 'Model' 类中的 'instances' 类方法内初始化。您应该使用'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 
    } 

} 
+0

太棒了,谢谢:) – nmdias

相关问题