I have been playing around with protocol extensions and I have a problem. Maybe what I want to achieve can’t be done. I have this playground:
//: Playground - noun: a place where people can play
import UIKit
protocol ArrayContainer {
typealias T
var array: [T] { get }
}
class MyViewController: UIViewController, ArrayContainer, UITableViewDataSource {
typealias T = String
var array = ["I am", "an Array"]
}
extension UITableViewDataSource where Self: ArrayContainer {
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return array.count
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
// Whatever
return UITableViewCell()
}
}
This is what I have and what I want:
- I have a protocol
ArrayContainer
that just has a typealias and a array which contains objects of this typealias type - I have a protocol extension of
UITableViewDataSource
to be used when the class conforms with the ArrayController
protocol. This simply returns the number of items of the array as number of rows. ThecellForRowAtIndexPath
method is not well implemented, but it is not the problem. - I have a
UIViewController
subclass called MyViewController
which implements both protocols.
The problem is that the compiler complains because MyViewController doesn’t conforms with UITableViewDataSource
but, as far as i know, it should be covered by the UITableViewDataSource extension. Am I missing something here? or maybe Objective-C protocols can not be extended?