无法在Swift 5中将类分配为协议

问题描述 投票:0回答:1

我正在学习一个教程,但刚开始时就陷入困境,试图将一个类分配为协议。

这是要设置为协议的模型:

//
//  TrainDetailViewModel.swift
//  LunchTrain
//
import Foundation

class TrainDetailViewModel {
    var didChangeData: ((TrainDetailViewData) -> Void)?

    var viewData: TrainDetailViewData {
        didSet {
            didChangeData?(viewData)
        }
    }

    init(viewData: TrainDetailViewData) {
        self.viewData = viewData
    }
}

然后这就是实际的视图控制器

import UIKit
import FirebaseFirestore
import FirebaseAuth

class TrainDetailViewController: ViewController<TrainDetailViewModel> {

    @IBOutlet weak var trainIcon: UIImageView!
    @IBOutlet weak var joinTrainButtonView: UIView!
    @IBOutlet weak var passengersTableView: UITableView!
    @IBOutlet weak var organiserLabel: UILabel!
    @IBOutlet weak var titleLabel: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
        bindViewModel()
    }

    private func bindViewModel() {
        viewModel.didChangeData = { [weak self] data in
            guard let strongSelf = self else { return }
            let train = data.train
            strongSelf.organiserLabel.text = "Organiser: \(train.owner)"
            strongSelf.titleLabel.text = train.title
        }
    }
}

因为我是Swift的新手,所以我希望坚持该教程。也许有人知道如何处理我的错误:

TrainDetailViewModel中,我得到:Expected get or set in a protocol property用于以下行:didSetProtocol initializers must not have bodies用于初始化

[我也发现这似乎是非常错误的:ViewController<TrainDetailViewModel> ...尤其是因为将UIViewController更改为ViewController会导致无法解析的标识符。

也使用TrainDetailViewModel作为扩展名都无法解决。

也许有人可以帮助我。 :)

问候

swift xcode protocols swift-protocols
1个回答
0
投票

您不能将didSet与计算所得的属性一起使用。

它必须是一个normal变量,然后它将起作用:

var viewData = TrainDetailViewData() {
    didSet {
        didChangeData?(viewData)
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.