没有完全获得自定义协议的概念,Swift 3

时间:2017-02-01 19:12:30

标签: swift delegates protocols custom-protocol

我提前为提出这样一个愚蠢的问题而道歉,但我从那里的其他答案中得不到我想知道的东西。 以下是Ray Wenderlich iOS课程中自定义委托协议的示例代码

protocol AddItemViewControllerDelegate: class {
func addItemViewControllerDidCancel(_ controller: AddItemViewController)
func addItemViewController(_ controller: AddItemViewController, 
didFinishAdding item: ChecklistItem) }

虽然协议的定义非常明确,但是为了使用它应该是一种合同。但这里是协议类的主体中协议功能的实现

func addItemViewController(_ controller: AddItemViewController,
                           didFinishAdding item: ChecklistItem) {
  let newRowIndex = items.count
  items.append(item)
  let indexPath = IndexPath(row: newRowIndex, section: 0)
  let indexPaths = [indexPath]
  tableView.insertRows(at: indexPaths, with: .automatic)
  dismiss(animated: true, completion: nil)
}

并没有实际使用 controller 参数,什么是didFinishAdding?据我了解,didFinishAdding只是内部参数 item 的外部名称。 但它是如何工作的,从协议主体可以理解,控制器命名为 AddItemViewController ChecklistItem 发送给符合的委托,或者它是一些预定义的函数类型?

2 个答案:

答案 0 :(得分:0)

这里我们谈谈Swift代码风格约定。

didFinishAdding是一个参数描述,它使调用者更清楚地了解它应该是什么。当然,你看到第二个参数的类型是ChecklistItem,但是为了让开发人员不要混淆,你做了这个简短的解释,哪个项应该传递给函数。

在您的示例中,我认为controller参数未被使用,因为在此特定实现中不需要它。然而,这是代表的一般风格:你说做了这个动作,什么是它的主题。可能存在需要知道AddItemViewController添加项目的内容的情况。

答案 1 :(得分:0)

didFinishAdding 只是帮助您更好地理解该功能的签名。

在您的示例中," controller"没有使用,但它只是在这种情况下。如果属性在签名中,则不会被迫使用它:)