为什么我可以更改仅获取属性?

时间:2020-06-18 05:10:34

标签: swift get set protocols

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

这里是示例。该协议包含自定义类类型的get-only属性,并且该类符合该类。

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属性应该是只读的,并且当用户完成编辑UITextView时将触发MyViewModel中的功能。


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 个答案:

答案 0 :(得分:1)

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

进行声明
var title: String {
    return "Something"
}

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

编辑

或者按照注释中的建议,您可以定义一个私有设置器 private (set) var title: String