Search code examples
iosobjective-cswiftgpuimage

What's the Swift equivalent of declaring `typedef SomeClass<SomeProtocol> MyType`?


I’m currently writing some Swift code in a project that is predominately Objective-C. In our ObjC code, we have a header that declares typedef GPUImageOutput<GPUImageInput> MyFilter;. We can then declare e.g. a @property that can only be a GPUImageOutput subclass that implements GPUImageInput.

(NOTE: GPUImageOutput and GPUImageInput are not defined by me; they are part of the GPUImage library)

Our Swift code doesn't seem to recognize this, even though the header is #imported in our Bridging Header. I’ve tried to replicate the declaration in Swift, but neither of these are proper syntax:
typealias MyFilter = GPUImageOutput, GPUImageInput
typealias MyFilter = GPUImageOutput : GPUImageInput


Solution

  • In Swift 4 you can achieve this with the new & sign (Below an example of a parameter confirming to UIViewController and UITableViewDataSource:

    func foo(vc: UIViewController & UITableViewDataSource) {
        // access UIViewController property
        let view = vc.view
        // call UITableViewDataSource method
        let sections = vc.numberOfSectionsInTableView?(tableView)
    }