gpt4 book ai didi

swift - 如何绕过其父类(super class)所需的指定初始化程序将值传递给父类(super class) init?

转载 作者:搜寻专家 更新时间:2023-11-01 07:27:17 27 4
gpt4 key购买 nike

我有一个继承 UITableViewCell 的基类,它声明了一个变量来存储将在 init 和其他函数中使用的类型值:

class CellBase: UITableViewCell {
var type: Int
init(theType: Int) {
type = theType
if (type == 100) { // more init code based on 'type'
} else {
}
}
// other functions
}

我有继承 CellBase 的子类:

class Cell1: CellBase {
init() {
super.init(type: 100)
}
}
class Cell2: CellBase {
init() {
super.init(type: 200)
}
}

我想将type 的值传递给CellBase。但是我想不出这样做的方法。 XCode 显示一些错误:

'required' initializer 'init(coder:)' must be provided by subclass of 'UITableViewCell'

如果我修改代码以覆盖所需的初始化器:

class CellBase2 : UITableViewCell {
var type: Int

override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
}

required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}

我无法将类型值从子类传递到 CellBase。如何解决这个问题?

最佳答案

Vadian 先于我,但由于我已经对此进行了编码,这里有一个替代方案,在子类中使用两个不同的自定义初始化程序,并在父类(super class)中为 type 使用惰性变量。 lazy var 本身并不是真正需要的,但是为了避免在 aDecoder init 中也必须初始化 type (除非你使用 fatalError 那里),您可以确保 CellBase 中的所有非惰性/非计算属性都使用默认值初始化。

父类(super class):

class CellBase: UITableViewCell {
var defaultType = 100
lazy var type: Int = { return self.defaultType }()

init(reuseIdentifier: String?, theType: Int) {
defaultType = theType

super.init(style: .Default, reuseIdentifier: reuseIdentifier)

if (type == 100) { // more init code based on 'type'
print("Intialized Cell1")
}
else {
print("Intialized Cell2")
}
}

required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
}

子类:

/* Style: .Default */
class Cell1: CellBase {

/* Allow for caller to specify reuse identifier */
init(reuseIdentifier: String?) {
super.init(reuseIdentifier: reuseIdentifier, theType: 100)
}

/* No reuse identifier (nil) */
init() {
super.init(reuseIdentifier: nil, theType: 100)
}

required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
}

class Cell2: CellBase {
init(reuseIdentifier: String?) {
super.init(reuseIdentifier: reuseIdentifier, theType: 200)
}

init() {
super.init(reuseIdentifier: nil, theType: 200)
}

required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
}

示例用法:

let c1A = Cell1(reuseIdentifier: "SomeCell1")   // "Intialized Cell1"
let c1B = Cell1() // "Intialized Cell1"
let c2A = Cell2(reuseIdentifier: "SomeCell2") // "Intialized Cell2"
let c2B = Cell2() // "Intialized Cell2"

关于swift - 如何绕过其父类(super class)所需的指定初始化程序将值传递给父类(super class) init?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35174714/

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