一种从多个类继承的方法

时间:2016-01-28 09:52:52

标签: swift class inheritance

我想在我的新课程中使用两个课程。第一个实现滑动删除,第二个实现长按手势:

class DeleteItem: UITableViewCell {
}

class OpenDetail: UITableViewCell {
}

由于Swift不允许类从多个类继承,因此以下示例显然不起作用:

class ItemViewCell: DeleteItem, OpenDetail {
}

因此,为了创建ItemViewCell并拥有两个选项,我必须让其中一个类相互继承:

class DeleteItem: UITableViewCell {
}

class OpenDetail: DeleteItem {
}

class ItemViewCell: OpenDetail {
}

问题是,如果我只想要长按手势,我将不得不在不继承DeleteItem的情况下创建新类。有没有更好的方法呢?

1 个答案:

答案 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