为类属性生成值

时间:2017-01-09 02:20:23

标签: swift

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

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

CompareTo

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

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

您无法从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的所有属性的要求超类的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")
    } 
}