Я пытаюсь создать общий подкласс UITableViewController в Swift, который будет вмещать любое количество различных типов ячеек табличного представления, не имея внутренних сведений о какой-либо из них.
Для этого я пытаюсь использовать протоколы для своих моделей и для ячеек табличного представления. Протокол для моделей вернет, к какому классу ячеек я должен перейти, а протокол для ячеек вернет ответы на такие вопросы, как, например, какой должна быть высота ячейки для данной модели.
Но у меня проблема с тем, чтобы протоколы работали, потому что со вторым протоколом я хочу перейти к классу ячейки, а не к ее экземпляру.
Протокол для моделей следующий:
protocol JBSTableItemDelegate
{
func tableCellDelegate() -> JBSTableViewCellInterface
}
Протокол для ячеек следующий:
protocol JBSTableViewCellInterface: class
{
static func registerNibsWithTableView(tableView: UITableView)
static func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath?, tableItem: JBSTableItemDelegate) -> CGFloat
static func tableView(tableView: UITableView, dequeueReusableCellWithIndexPath indexPath: NSIndexPath, tableItem: JBSTableItemDelegate, delegate: AnyObject) -> JBSTableViewCell
}
Обратите внимание на использование ключевого слова static. Эти методы являются методами класса в подклассах UITableViewCell, и мне кажется, что добавление static - это то, что мне нужно сделать, чтобы убедиться, что эти классы соответствуют, или я так понимаю.
Когда я использую первый протокол, код выглядит так, и он компилируется:
let tableViewCellInterface = tableItem!.tableViewCellInterface()
Он вызывает этот метод (как один из примеров):
func tableViewCellInterface() -> JBSTableViewCellInterface
{
return JBSLiteratureTableViewCell.self as! JBSTableViewCellInterface
}
Это возвращает класс ячейки, например "JBSLiteratureTableViewCell.self"
Когда я использую второй протокол, код выглядит так, и он не компилируется:
returnFloat = tableViewCellInterface.tableView(tableView, heightForRowAtIndexPath: indexPath, tableItem: tableItem!)
Он не может быть скомпилирован из-за ранее использованного ключевого слова static, и я получаю следующую ошибку компилятора:
'JBSTableViewCellInterface' не имеет члена с именем 'tableView'
Если я уберу статические ключевые слова из функций протокола, он компилируется, но потом подклассы UITableViewCell жалуются, говоря:
'JBSLiteratureTableViewCell' не соответствует протоколу 'JBSTableViewCellInterface'
Это потому, что теперь они пытаются убедиться, что методы экземпляра существуют, а их нет.
Как сделать так, чтобы быстрый класс соответствовал протоколу на уровне класса, чтобы он мог быть моим делегатом, а не каким-то экземпляром класса? Я уверен, что смогу обойти это, создав вспомогательные классы протокола JBSTableViewCellInterface, которые являются одиночными и позволяют им выполнять работу, но я бы предпочел встроить их прямо в подклассы UITableViewCell в их методах класса.