为什么我可以更改 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
谁能解释为什么我可以将值设置为只获取 属性?
这是例子。此协议包含自定义 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