【问题标题】:Cannot assign to property: 'outputs' is a get-only property无法分配给属性:“输出”是仅获取属性
【发布时间】:2020-11-09 19:08:24
【问题描述】:

我正在尝试使用 MVVM 输入输出方法来实现 VC,但是当我尝试在视图控制器中绑定重新分配输出闭包时遇到编译器错误。我明白“输出”是一个只能获取的属性,但它的属性是被设置的。

我该如何解决这个问题?

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

        }
    }
}

【问题讨论】:

  • 请包含SearchViewModelOutputsType
  • 你包含ViewModelOutputsType协议
  • 谢谢你,这只是一个错字,它的目的是到处都是 ViewModelOutputsType。

标签: ios swift mvvm protocols


【解决方案1】:

你不能改变ViewModelOutputsType,因为它可能是一个结构,因为协议。我想如果你有 protocol ViewModelOutputsType: class { 它可以让你改变属性

【讨论】:

    【解决方案2】:

    问题是ViewModelOutputsType 可以是值或引用类型。如果它是一个值类型,那么改变它的任何属性都会改变实例本身。您可以通过限制协议类来解决此问题,从而保证它是引用类型。

    protocol ViewModelOutputsType: class {
        var didReceiveServiceError: ((Error) -> Void) { get set }
        var reloadData: (() -> Void) { get set }
    }
    

    【讨论】:

      猜你喜欢
      • 2018-01-08
      • 1970-01-01
      • 1970-01-01
      • 2017-02-28
      • 2017-10-21
      • 1970-01-01
      • 1970-01-01
      • 2022-07-14
      • 1970-01-01
      相关资源
      最近更新 更多