Search code examples
iosswiftdelegatesprotocols

Swift: How to pass the Generic protocol as a parameter for another protocol


I want to pass Generic protocol as a parameter for another protocol.

protocol OperationDelegate {
    associatedtype T
    func onOperationFinished(result:Array<T>)
    func onOperationError(error:OperationError, errorMessage:String)
}


protocol ResultDelegate {

    func findResult(query: String,odelegate: OperationDelegate<MyOwnDataType>)

}

How to pass the Generic protocol as a parameter for another protocol

I got following error

Protocol 'OperationDelegate' can only be used as a generic constraint because it has Self or associated type requirements

Solution

  • protocol OperationDelegate {
        associatedtype T
        func onOperationFinished(result:Array<T>)
        func onOperationError(error: Error, errorMessage:String) 
    }
    
    protocol ResultDelegate {
        func findResult<OpDelegate: OperationDelegate>(query: String, odelegate: OpDelegate) 
    }
    

    //Added few PlayGround works

        class ResultsFinder: ResultDelegate {
    
    
    
        func findResult<OpDelegate>(query: String, odelegate: OpDelegate) where OpDelegate : OperationDelegate {
    
            print(#function)
            // Do some operations
            let s1 = Student()
            s1.name = "one"
            let s2 = Student()
            s2.name = "two"
    
            let addressList = [s1,s2]
            odelegate.onOperationFinished(result: addressList as! [OpDelegate.T])
    
        }
    }
    

    also

    class ResultDisplay: OperationDelegate {
    
        typealias T = Student
    
        func onOperationFinished(result: [Student]) {
            // Display address
              print(#function)
        }
    
    
        func onOperationError(error: Error, errorMessage: String) {
            // Display error
              print(#function)
        }
    
    }
    

    class Mainfunction {

    let resultDisplay = ResultDisplay()
    let finder = ResultsFinder()
    func start() {
    
          print(#function)
        finder.findResult(query: "Sridhar", odelegate: resultDisplay)
    
    }
    

    }

    let main = Mainfunction()
    main.start()