【问题标题】:Why is a lazy var accessing a class property before this one had a value?为什么一个惰性 var 在这个类属性有值之前访问一个类属性?
【发布时间】:2020-09-09 00:27:34
【问题描述】:

我有一个具有惰性 UIView 属性的 ViewController:

class DetailView: UIViewController {
    var presenter: DetailPresenterProtocol?
    var heroData: MarvelData?
    var marvelDataCollection: [MarvelData]? {
        didSet {
            print("Initialized")
        }
    }

    lazy var bodyView: BodyDetailView = {
        print("Inside lazy var initialization")
        guard let data = marvelDataCollection else { return BodyDetailView(data: [], elems: "")}
        print(data)
        let body = BodyDetailView(data: data, elems: heroData?.description ?? "No description")

        return body
    }()
   ///More stuff over here
}
// MARK: - Lifecycle
extension DetailView {
    override func viewDidLoad() {
        super.viewDidLoad()
        presenter?.viewDidLoad()
        title = heroData?.name ?? "No name"
        setupViews()//Here I set the lazy UIView
        print("Finished view did load")
    }
}

问题是当在惰性变量中解包数据时,它是 nil,因为“marvelDataCollection”已经没有值了。

这是流程:

  1. 惰性变量初始化内部

  2. 已加载完成的视图

  3. 已初始化

我做错了什么? 谢谢

【问题讨论】:

    标签: ios swift


    【解决方案1】:

    我找到了一个可能的解决方案,它基于在演示者回调中调用 setupViews()(就在类属性实例化之后)而不是 viewDidLoad:

    //MARK: - Presenter -> View
    extension DetailView: DetailViewProtocol {
        func saveData(data: [MarvelData]) {
            marvelDataCollection = data
            setupViews()
        }
        
        func setupView(with data: MarvelData) {
            heroData = data
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-27
      • 1970-01-01
      • 2010-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-10
      相关资源
      最近更新 更多