gpt4 book ai didi

swift - 如何声明一个子类的指定初始化器,其参数比父类(super class)多?

转载 作者:搜寻专家 更新时间:2023-11-01 06:14:14 32 4
gpt4 key购买 nike

与父类(super class)的初始化程序相比,我正在创建一个带有额外参数的子类指定初始化程序,但是,我收到错误。代码是:

class Pregunta: Codable {
var codImagen: String
var respCorrecta: Int
var respUsuario = -1

init(codImagen:String, respCorrecta:Int){
self.codImagen = codImagen
self.respCorrecta = respCorrecta
}
}

class PregRev: Pregunta {
var codAyuda: String

init(codImagen:String, respCorrecta:Int, codAyuda: String){
super.init(codImagen: codImagen, respCorrecta: respCorrecta)
self.codAyuda = codAyuda
}
}

我得到了错误

'required' initializer 'init(from:)' must be provided by subclass of 'Pregunta'

有什么问题?我读到我只需要将 super.init 与父类(super class)初始值设定项一起使用。提前致谢。

最佳答案

这与您对 init(codImagen:String, respCorrecta:Int, codAyuda: String) 的实现无关(尽管该实现实际上是错误的)。这与您的父类(super class)采用 Codable 这一事实有关。

Codable 需要init(from:) 的实现。您的父类(super class)通过协议(protocol)扩展继承了它,因此您没有提供实现这一事实没有问题。

但是子类就是另外一回事了。通过在子类中创建一个指定的初始化器,你已经杀死了继承。因此,您的子类不会从父类(super class)继承 init(from:) 的实现。因此,您必须在子类中明确提供它:

class Pregunta: Codable {
var codImagen: String
var respCorrecta: Int
var respUsuario = -1

init(codImagen:String, respCorrecta:Int){
self.codImagen = codImagen
self.respCorrecta = respCorrecta
}
}

class PregRev: Pregunta {
var codAyuda: String
enum CodingKeys : String, CodingKey {
case codAyuda
}
init(codImagen:String, respCorrecta:Int, codAyuda: String){
self.codAyuda = codAyuda
super.init(codImagen: codImagen, respCorrecta: respCorrecta)
}
required init(from decoder: Decoder) throws {
let con = try decoder.container(keyedBy: CodingKeys.self)
self.codAyuda = try con.decode(String.self, forKey: .codAyuda)
try super.init(from:decoder)
}
}

关于swift - 如何声明一个子类的指定初始化器,其参数比父类(super class)多?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48491971/

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