我在实施协议时遇到错误。
我已在名为“ ”的文件中声明了如下协议TransactionListViewViewModelItem.swift。以下是我在此文件中的内容
protocol TransactionListViewViewModelItemProtocol: Comparable {
var transactionBookingDate: Date { get }
var transactionPartnerDisplayName: String { get }
}
struct TransactionListViewViewModelItem: TransactionListViewViewModelItemProtocol {
static func < (lhs: TransactionListViewViewModelItem, rhs: TransactionListViewViewModelItem) -> Bool {
return lhs.transactionBookingDate < rhs.transactionBookingDate
}
static func == (lhs: TransactionListViewViewModelItem, rhs: TransactionListViewViewModelItem) -> Bool {
return lhs.transactionBookingDate == rhs.transactionBookingDate
}
var transactionBookingDate: Date {
transactionModel.transactionDetail.bookingDate.getTransactionDate()
}
var transactionPartnerDisplayName: String {
transactionModel.partnerDisplayName
}
private let transactionModel: Transaction
// MARK: - init
init(transaction: Transaction) {
transactionModel = transaction
}
}
Run Code Online (Sandbox Code Playgroud)
现在,当我尝试在我的视图模型类中使用上面的内容时,TransactionListViewViewModel.swift如下所示
protocol TransactionListViewViewModelProtocol {
init(fileName: String)
var numberOfRows: Int { get }
func transactionItem(at indexPath: IndexPath) -> TransactionListViewViewModelItemProtocol
}
class TransactionListViewViewModel: TransactionListViewViewModelProtocol {
private var arrayOfTransactions: [TransactionListViewViewModelItemProtocol] = []
// MARK: - init
required init(fileName: String) {
fetchAllTransactionsModel(from: fileName)
}
/*
rest code....
*/
}
Run Code Online (Sandbox Code Playgroud)
我收到错误为Use of protocol 'TransactionListViewViewModelItemProtocol' as a type must be written 'any TransactionListViewViewModelItemProtocol'
请指导我我做错了什么。
小智 2
这是因为您要返回的协议正在分配另一个协议。我不确定与Comparable相关的是什么触发了**,但您可以通过删除 Comparable 赋值或按以下方式使用泛型来修复它(明确专业化):
protocol TransactionListViewViewModelProtocol {
init(fileName: String)
var numberOfRows: Int { get }
func transactionItem<T: TransactionListViewViewModelItemProtocol>(at indexPath: IndexPath) -> T
}
Run Code Online (Sandbox Code Playgroud)
** 如果您打开 Comparable 定义,它会分配给 Equatable。Equatable 在他们的方法中接收 Self 作为参数。Comparable也有接收Self的方法。下面的示例反映了该处理:
如果您使用泛型,它也会被触发:
在这种情况下,我们必须明确指定:
protocol ABCD {
func method<T: ProtocolThatUsesGenerics>() -> T
}
protocol UsingSecondLayer {
func method<T: SecondLayerUsingSelf>() -> T
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7820 次 |
| 最近记录: |