无法在属性初始化程序中使用实例成员'currColor';属性初始化程序在“自我”可用之前运行

时间:2020-05-22 03:52:01

标签: swift xcode macos

因此,我对Swift还是很陌生,希望在这种大流行期间能够自学Swift。 我正在制作一个应用程序,它要做的就是在按下按钮时更改标签的颜色。 我的故事板看起来像这样

    @IBAction func ChangeButton(_ sender: Any) {
        TopLeft.backgroundColor = CornerColor(c: TopLeft.backgroundColor!).getFirstColor()
    }

我的CornerColor类看起来像这样

    class CornerColor{

        var currColor : UIColor

        init(c : UIColor) {
            self.currColor = c
        }
        private static let colorsArray = [UIColor.black, UIColor.red, UIColor.yellow, UIColor.blue]

        var index = colorsArray.firstIndex(of: currColor)
        ....
    }

我希望索引是将TopLeft.backgroundColor传递给CornerColor类时,它将读取颜色并查看颜色在数组中的位置,然后执行index ++获取下一个颜色。

但是,似乎在“ var index”行中,它显示“不能在属性初始化程序中使用实例成员'currColor';属性初始化程序在'self'可用之前运行”

我不太了解发生了什么。非常感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

init()调用之前初始化属性(代码的顺序无关紧要,以防万一),这就是为什么会出错。这是更正的变体

class CornerColor{

        var currColor : UIColor

        init(c : UIColor) {
            self.currColor = c
            self.index = colorsArray.firstIndex(of: c)
        }
        private static let colorsArray = [UIColor.black, UIColor.red, UIColor.yellow, UIColor.blue]

        var index: Int 
        ....
    }

答案 1 :(得分:0)

这意味着您无法初始化刚在Class中创建的属性。 从技术上讲,初始化器是在类中执行的第一件事,如果在调用初始化器之前使用属性,则尚未创建该属性。 您可以做的是在类内部创建一个方法,然后在初始化类后调用它,如下所示:

class CornerColor{

    var currColor : UIColor
    private static let colorsArray = [UIColor.black, UIColor.red, UIColor.yellow, UIColor.blue]
    var index : UIColor

    init(c : UIColor) {
        self.currColor = c
        self.getNextColor()
    }

    func getNextColor(){
        self.index = colorsArray.firstIndex(of: currColor)
    }
    ....
}

或者您可以在IBOutlet中调用该方法:

@IBAction func ChangeButton(_ sender: Any) {
    TopLeft.backgroundColor = CornerColor(c: TopLeft.backgroundColor!).getFirstColor()
    CornerColor.getNextColor()
}