Почему я могу изменить свойство только для получения? - PullRequest
0 голосов
/ 18 июня 2020

Может ли кто-нибудь объяснить, почему я могу установить значение для свойства только для получения?

Вот пример. Этот протокол содержит свойство только для получения типа настраиваемый класс и класс, соответствующий ему.

protocol ViewModel {
    var title: MyTitle { get }
}

class MyTitle {
    var title: String
    var otherProperty: Int
}

class MyViewModel: ViewModel {
    var title: MyTitle
    init() {
        self.title = MyTitle.init()
    }
    func didChangeTitle(title: String) {
        self.title.title = title
    }
}

Я думаю, что свойство title должно быть только для получения и будет запускать функцию в MyViewModel, когда пользователь fini sh редактирование UITextView.


class TableViewCell: UITableViewCell, UITextViewDelegate {
    var viewModel: MyViewModel?
    func bind(to viewModel: MyViewModel) {
        self.viewModel = viewModel
    }

    func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
        if text == "\n" {
            self.viewModel?.title.title = textView.text /* Why can the property supposed to be get-only be changed here */
            textView.resignFirstResponder()
            return false
        }
        return true
    }
}

Но на самом деле я могу обновить значение напрямую без функции MyViewModel.

Кто-нибудь может объяснить?

1 Ответ

1 голос
/ 18 июня 2020

Фактически вы не объявляете свойство get-only, согласовывая протокол. Вы можете использовать вычисленное свойство и объявить его с помощью

var title: String {
    return "Something"
}

И, кроме того, вы изменяете свойство внутри класса, а не сам класс

EDIT

Или, как предлагается в комментариях, вы можете определить частный сеттер private (set) var title: String

...