给自己分配一个属性

时间:2019-01-29 08:52:53

标签: ios swift

我不了解此错误。请检查以下代码:

class CardCarousel: UIView {
    var numberOfRatesLabel: UILabel

    var bestRates: BestRates! {
        didSet {
            numberOfRatesLabel.text = bestRates.title
        }
    }

    override init(frame: CGRect) {
        self.numberOfRatesLabel = numberOfRatesLabel
        super.init(frame: frame)

        initComponents()
    }

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

        initComponents()
    }

    private func initComponents() {
        numberOfRatesLabel = UILabel(frame: .zero)
        self.addSubview(numberOfRatesLabel)
    }
}

我检查了所有提及此错误的问题。我尝试了一些东西,但是没有更好的事情发生。

我发现了此错误:

  

为其分配属性。

如果我将numberOfRatesLabel放在init方法的参数中,则会出现此错误:

  

Initializer不会从其超类中覆盖指定的初始值设定项

3 个答案:

答案 0 :(得分:3)

问题在这里:

override init(frame: CGRect) {
    self.numberOfRatesLabel = numberOfRatesLabel // <- no local declaration of numberOfRatesLabel
    super.init(frame: frame)

    initComponents()
}

您只应该实现以下内容:

convenience init(frame: CGRect, numberOfRatesLabel: UILabel) {
    self.numberOfRatesLabel = numberOfRatesLabel
    self.init(frame: frame)

    initComponents()
}

应该可以解决问题。您不必覆盖init(frame: CGRect)。但是,当您在initComponents()中启动标签时,可以这样做:

var numberOfRatesLabel: UILabel?

override init(frame: CGRect) {
    super.init(frame: frame)

    initComponents()
}

所有取决于您的用例。

答案 1 :(得分:1)

在以下行中: self.numberOfRatesLabel = numberOfRatesLabel

您没有numberOfRatesLabel的本地声明,因此它等于 self.numberOfRatesLabel = self.numberOfRatesLabel 由于没有理由这样做,swift会阻止您这样做。

答案 2 :(得分:0)

我在注释中对初始化器感到不对劲 我现在在自己的位置检查了它的正常工作,希望它也对您也有用。

请仔细阅读评论。

override init(frame: CGRect) {
        // this is what you are doing wrong because numberOfRatesLabel class member is not came in to existance without its instance got memory
        // you can comment this line if you want to assign a uilable to the numberOfRatesLabel from other class
        //self.numberOfRatesLabel = numberOfRatesLabel
        super.init(frame: frame)

        initComponents()
    }
    // and still you want to initilize with constructor then you should use convenience Initilizer
    convenience  init(frame: CGRect, num_ofRatLabel : UILabel) {
        self.init(frame: frame)
        self.numberOfRatesLabel = num_ofRatLabel
    }