使用协议“YourProtocol”作为类型必须写为“any YourProtocol”错误

Nup*_*wat 11 protocols swift

我在实施协议时遇到错误。

我已在名为“ ”的文件中声明了如下协议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的方法。下面的示例反映了该处理:

使用 Self 进行协议链接

如果您使用泛型,它也会被触发:

与之前相同的错误,但使用泛型

在这种情况下,我们必须明确指定:

protocol ABCD {
    func method<T: ProtocolThatUsesGenerics>() -> T
}

protocol UsingSecondLayer {
    func method<T: SecondLayerUsingSelf>() -> T
}
Run Code Online (Sandbox Code Playgroud)