swift - 为类属性生成值

标签 swift

我正在尝试子类化 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/

相关文章:

ios - 准备 segue : Cannot convert value of type 'UIViewController' to specified type 'SecondViewController'

text - Swift如何将文本的哈希值数字转换回文本

swift - AVPlayer m3u8 视频结束问题

swift - Swift 中的浮点十六进制表示法

swift - swift 将 map 图钉从 firebase 加载到 mapkit 上,以便所有用户都能看到

ios - 在 5 个像素而不是默认的 1 个像素后触摸拖动到 UIButton 内

ios - 不带 TabBarController 的选项卡栏 - 在 Storyboard 中为选项卡栏项目添加 View Controller

swift - 无法设置委托(delegate)来重新加载 TableView

ios - 在 cocoapods Podspec 中定义自定义模块映射文件

ios - UIPageViewController 在进入主页时堆叠 ViewController