Matt Quiros Matt Quiros - 2 months ago 32
iOS Question

Define a Swift typealias for any object that implements multiple protocols

I'm trying to define a

typealias
for a UITableViewCell's delegate property that conforms to multiple protocols. This is what I'm trying to do and Swift complains that my syntax is wrong:

// The typealias definition
typealias CellDelegate = AnyObject<UIPickerViewDataSource, UIPickerViewDelegate>

// In my UITableViewCell subclass:
weak var delegate: CellDelegate?


"Cannot specialize the non-generic type AnyObject" is the error I'm getting. How do I do this correctly?

Answer

The code that you posted has a different meaning from what you'd expect. You're treating AnyObject like a generic type, with UIPickerViewDataSource and UIPickerViewDelegate as type arguments. It's the same thing as creating a Dictionary with Int keys and String values, for example:

var someDictionary: Dictionary<Int, String>

What you're trying to accomplish needs a different construct, called protocol composition. Swift provides it specifically to express types that conforms to multiple protocols. Its syntax is the following, you can use it anywhere you can use regular types:

protocol<FirstProtocol, SecondProtocol, ...>

Using this feature, your code would become:

// The typealias definition
typealias CellDelegate = protocol<UIPickerViewDataSource, UIPickerViewDelegate>

// In my UITableViewCell subclass:
weak var delegate: CellDelegate?

Protocol composition is explained in Apple's guide to the Swift language, here.

Comments