Swift:无法使用只读属性“ xxx”覆盖可变属性

时间:2019-03-22 10:27:05

标签: swift

我不明白此错误的含义。这就是我想要做的:

protocol P {
    var testTitle: String? { get }
}

class MyViewController: UIViewController, P {
    var testTitle: String? {
        didSet {
            self.title = testTitle
        }
    }
}

final class TestViewController: MyViewController {
    var testTitle: String? { // Error occurs here
        return "Test" 
    }
}

我得到了:

  

无法使用只读属性'testTitle'覆盖可变属性

您能帮助我了解发生了什么吗?也许对某些人来说是微不足道的,但对我而言却不是。

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

该协议要求采用类通过getter实现属性testTitle,但并非禁止使用getter setter声明该属性。< / p>

要覆盖属性,您必须覆盖类中的(整个)签名,而不是协议要求。

由于testTitle被声明为读/写,因此您不能将其重写为只读。

答案 1 :(得分:1)

您不能实现比基类更严格的子类(它只会反过来起作用)。因此,如果基类实现了read / write属性,则不能在派生类中将其设置为只读。

因此:

final class TestViewController: MyViewController {
    override var testTitle: String? { // No error occurs here 
        get {
            return "Test" 
        }
        set {
            super.testTitle = newValue
        }
    }
}