为什么我可以更改 get-only 属性?

Why I can change the get-only property?

谁能解释为什么我可以将值设置为只获取 属性?

这是例子。此协议包含自定义 class 类型的仅获取 属性 和符合它的 class。

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 属性 应该是 get-only,当用户完成编辑时会在 MyViewModel 中触发函数 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的功能直接更新值

谁能解释一下?

您实际上并不是通过遵守协议来声明 get-only 属性。您可以使用计算 属性,并通过

声明它
var title: String {
    return "Something"
}

此外,您正在更改 class 中的 属性,而不是 class 本身

编辑

或者按照评论中的建议,您可以定义一个私有 setter private (set) var title: String