我正在学习一个教程,但刚开始时就陷入困境,试图将一个类分配为协议。
这是要设置为协议的模型:
//
// 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
用于以下行:didSet
和Protocol initializers must not have bodies
用于初始化
[我也发现这似乎是非常错误的:ViewController<TrainDetailViewModel>
...尤其是因为将UIViewController
更改为ViewController
会导致无法解析的标识符。
也使用TrainDetailViewModel
作为扩展名都无法解决。
也许有人可以帮助我。 :)
问候
您不能将didSet
与计算所得的属性一起使用。
它必须是一个normal变量,然后它将起作用:
var viewData = TrainDetailViewData() {
didSet {
didChangeData?(viewData)
}
}