Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Swift: Cannot override mutable property with read-only property 'xxx'

Tags:

swift

I don't understand the meaning of this error. This is what I am trying to do:

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" 
    }
}

And I'm getting:

Cannot override mutable property with read-only property 'testTitle'

Could you help me understanding what's going on? Maybe it's trivial for some people but not for me.

Thanks for your help.

like image 747
Rob Avatar asked Mar 22 '19 10:03

Rob


2 Answers

You cannot implement a subclass to be more restrictive than the base class (it would only work the other way round). So if the base class implements a read/write property, you cannot make it read only in your derived class.

Therefore:

final class TestViewController: MyViewController {
    override var testTitle: String? { // No error occurs here 
        get {
            return "Test" 
        }
        set {
            super.testTitle = newValue
        }
    }
}
like image 178
Andreas Oetjen Avatar answered Sep 18 '22 04:09

Andreas Oetjen


The protocol requires that the adopting class implements a property testTitle with a getter but it does not forbid to declare the property with getter and setter.

To override a property you have to override the (entire) signature in the class, not the protocol requirement.

As testTitle is declared as read/write you cannot override it as read-only.

like image 45
vadian Avatar answered Sep 19 '22 04:09

vadian