gpt4 book ai didi

swift - 为什么在协议(protocol)中定义的覆盖方法在父类而不是子类中被调用?

转载 作者:可可西里 更新时间:2023-11-01 01:40:51 28 4
gpt4 key购买 nike

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

但事实并非如此。被调用的函数是来自父级的函数,在“模型”类中定义。

我还尝试使“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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com