Using delegates on generic protocol

后端 未结 2 1814
半阙折子戏
半阙折子戏 2021-01-22 23:14

I have got this code:

protocol GenericProtocol: class {
    associatedtype type
    func funca(component: type)
}

class MyType {

    weak var delegate         


        
2条回答
  •  情深已故
    2021-01-22 23:54

    The difference between generics and associated types is that generics are specified at instantiation, associated types during implementation. So you cannot use the protocol type as a concrete type because the associated type depends on the implementing type.

    However, there are a few workarounds:

    1) Use the type of the delegate as a generic type:

    class MyType {
        typealias T = Delegate.type
        ...
    }
    

    2) Use a common protocol on your delegate method instead of an associated type:

    protocol CommonProtocol { ... }
    
    protocol DelegateProtocol {
        func funca(component: CommonProtocol)
    }
    

    3) Use closures for type erasure (this is also done in the Swift Standard Library for the Sequence protocol with AnySequence)

    struct AnyGenericProtocol: GenericProtocol {
        typealias type = GenericType
        private let f: (GenericType) -> ()
    
        init(_ g: GenericProtocol) where G.type == GenericType {
            f = { component in
                g.funca(component: component)
            }
        }
    
        func funca(component: GenericType) {
            f(component)
        }
    }
    
    class MyType {
        var delegate: AnyGenericProtocol
        ...
    }
    

提交回复
热议问题