无法分配给 属性:'outputs' 是一个 get-only 属性
Cannot assign to property: 'outputs' is a get-only property
我正在尝试使用 MVVM 输入输出方法实现 VC,但是当我尝试在视图控制器中绑定重新分配输出闭包时出现编译器错误。我明白 'outputs' 是一个只获取 属性,但它的属性是获取设置的。
我该如何解决这个问题?
protocol ViewModelOutputsType {
var didReceiveServiceError: ((Error) -> Void) { get set }
var reloadData: (() -> Void) { get set }
}
protocol ViewModelType {
var outputs: ViewModelOutputsType { get }
}
final class ViewModel: ViewModelType, ViewModelOutputsType {
var outputs: ViewModelOutputsType { return self }
//output
var didReceiveServiceError: ((Error) -> Void) = { _ in }
var reloadData: (() -> Void) = {}
}
class ViewController: UIViewController {
var viewModel: ViewModel
init(viewModel: ViewModel) {
self.viewModel = viewModel
super.init(nibName: nil, bundle: nil)
}
private func bind() {
//this gives the compiler error
viewModel.outputs.didReceiveServiceError = { [weak self] error in
}
//this gives the compiler error
viewModel.outputs.reloadData = { [weak self] in
}
}
}
你不能改变 ViewModelOutputsType
因为它可能是一个结构,因为协议。我想如果你有 protocol ViewModelOutputsType: class {
它将允许你改变属性
问题是 ViewModelOutputsType
可以是值类型或引用类型。如果它是一个值类型,那么改变它的任何属性都会改变实例本身。您可以通过使协议 class 受到约束来解决此问题,从而保证它是引用类型。
protocol ViewModelOutputsType: class {
var didReceiveServiceError: ((Error) -> Void) { get set }
var reloadData: (() -> Void) { get set }
}
我正在尝试使用 MVVM 输入输出方法实现 VC,但是当我尝试在视图控制器中绑定重新分配输出闭包时出现编译器错误。我明白 'outputs' 是一个只获取 属性,但它的属性是获取设置的。
我该如何解决这个问题?
protocol ViewModelOutputsType {
var didReceiveServiceError: ((Error) -> Void) { get set }
var reloadData: (() -> Void) { get set }
}
protocol ViewModelType {
var outputs: ViewModelOutputsType { get }
}
final class ViewModel: ViewModelType, ViewModelOutputsType {
var outputs: ViewModelOutputsType { return self }
//output
var didReceiveServiceError: ((Error) -> Void) = { _ in }
var reloadData: (() -> Void) = {}
}
class ViewController: UIViewController {
var viewModel: ViewModel
init(viewModel: ViewModel) {
self.viewModel = viewModel
super.init(nibName: nil, bundle: nil)
}
private func bind() {
//this gives the compiler error
viewModel.outputs.didReceiveServiceError = { [weak self] error in
}
//this gives the compiler error
viewModel.outputs.reloadData = { [weak self] in
}
}
}
你不能改变 ViewModelOutputsType
因为它可能是一个结构,因为协议。我想如果你有 protocol ViewModelOutputsType: class {
它将允许你改变属性
问题是 ViewModelOutputsType
可以是值类型或引用类型。如果它是一个值类型,那么改变它的任何属性都会改变实例本身。您可以通过使协议 class 受到约束来解决此问题,从而保证它是引用类型。
protocol ViewModelOutputsType: class {
var didReceiveServiceError: ((Error) -> Void) { get set }
var reloadData: (() -> Void) { get set }
}