我想在我的新课程中使用两个课程。第一个实现滑动删除,第二个实现长按手势:
class DeleteItem: UITableViewCell {
}
class OpenDetail: UITableViewCell {
}
由于Swift不允许类从多个类继承,因此以下示例显然不起作用:
class ItemViewCell: DeleteItem, OpenDetail {
}
因此,为了创建ItemViewCell
并拥有两个选项,我必须让其中一个类相互继承:
class DeleteItem: UITableViewCell {
}
class OpenDetail: DeleteItem {
}
class ItemViewCell: OpenDetail {
}
问题是,如果我只想要长按手势,我将不得不在不继承DeleteItem
的情况下创建新类。有没有更好的方法呢?
答案 0 :(得分:4)
这是使用协议和协议扩展的完美案例。例如,swift protocol
就像Java中的接口一样。协议可以定义一组功能,这些功能必须由希望符合该协议的实体来实现,而且协议也可以定义必须存在于这些实体中的属性。例如:
protocol ItemDeleter {
var deletedCount: Int {get set}
func deleteItem(item: ItemType)
}
问题是,即使多个实体共享相同的删除项目逻辑,每个实体也必须提供自己的func deleteItem(item: ItemType)
实现,这样协议扩展就派上用场了。例如:
extension ItemDeleter {
func deleteItem(item: ItemType) {
// logic needed to delete an item
// maybe incremented deletedCount too
deletedCount++
}
}
然后,您可以使ItemViewCell
符合ItemDeleter
协议,在这种情况下,您只需要确保ItemViewCell
具有属性deletedCount: Int
。它不需要为func deleteItem(item: ItemType)
提供实现,因为协议本身为此函数提供了默认实现,但是您可以在类中覆盖它,并且将使用新的实现。这同样适用于DetailOpener protocol
。