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

Rob*_*Rob 5 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" 
    }
}
Run Code Online (Sandbox Code Playgroud)

我得到:

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

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

谢谢你的帮助。

And*_*jen 8

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

因此:

final class TestViewController: MyViewController {
    override var testTitle: String? { // No error occurs here 
        get {
            return "Test" 
        }
        set {
            super.testTitle = newValue
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


vad*_*ian 4

该协议要求采用的类使用testTitlegetter 实现属性,但并不禁止使用 gettersetter声明属性。

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

正如testTitle声明为读/写一样,您不能将其覆盖为只读。