gpt4 book ai didi

swift - 为类属性生成值

转载 作者:行者123 更新时间:2023-11-28 15:57:10 26 4
gpt4 key购买 nike

我正在尝试子类化 UILabel 并自动为其中一个属性生成一个值,这样我就可以使用一些值进行初始化,并随机生成其他值。

例如,在这里我希望能够创建一个新的 MyLabel,传入 labelString 的值,并随机生成 labelNumber 的值。

class MyLabel: UILabel {
var labelString : String!
var labelNumber : Int!

init(frame: CGRect, labelString: String) {
self.labelString = labelString
self.labelNumber = createNumber()
super.init(frame: frame)
}

func createNumber() -> Int {
return Int(arc4random())
}

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

我收到错误消息“在 super.init 初始化 self 之前,在方法调用中使用了‘self’。”有没有办法解决这个问题,或者可以使用更好的模式?

非常感谢您的帮助!

最佳答案

在一切都被初始化之前,您不能从 init 调用实例方法。处理它的一种方法是使 createNumber 成为一个 static 函数,它不需要初始化类来调用:

class MyLabel: UILabel {
var labelString : String!
var labelNumber : Int!

init(frame: CGRect, labelString: String) {
self.labelString = labelString
self.labelNumber = MyLabel.createNumber()
super.init(frame: frame)
}

static func createNumber() -> Int {
return Int(arc4random())
}

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

另一种处理方法是将 labelNumber 的初始化移动到调用 super.init 之后。这是可行的,因为 labelNumber 是一个 Optional,因此最初被赋予 nil 的值,它满足子类 的所有属性的要求MyLabel 在调用父类(super class)的 init 之前被初始化。

class MyLabel: UILabel {
var labelString : String!
var labelNumber : Int!

init(frame: CGRect, labelString: String) {
self.labelString = labelString
super.init(frame: frame)
self.labelNumber = createNumber()
}

func createNumber() -> Int {
return Int(arc4random())
}

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

关于swift - 为类属性生成值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41540106/

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