Swift: невозможно переопределить изменяемое свойство с помощью свойства «только для чтения» «xxx» - PullRequest
1 голос
/ 22 марта 2019

Я не понимаю смысл этой ошибки. Вот что я пытаюсь сделать:

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 ]

2 голосов
/ 22 марта 2019

Протокол требует, чтобы принимающий класс реализовал свойство testTitle с помощью геттера, но он не запрещает объявлять свойство с помощью метода getter и .

Чтобы переопределить свойство, вы должны переопределить (полную) подпись в классе, а не требование протокола.

Поскольку testTitle объявлено для чтения / записи, вы не можете переопределить его только для чтения.

1 голос
/ 22 марта 2019

Вы не можете реализовать подкласс, чтобы быть более строгим, чем базовый класс (он будет работать только наоборот).Поэтому, если базовый класс реализует свойство чтения / записи, вы не можете сделать его доступным только для чтения в своем производном классе.

Следовательно:

final class TestViewController: MyViewController {
    override var testTitle: String? { // No error occurs here 
        get {
            return "Test" 
        }
        set {
            super.testTitle = newValue
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...