没有完全理解自定义协议的概念,Swift 3

Not fully getting the concept of custom protocols, Swift 3

对于提出这样一个愚蠢的问题,我深表歉意,但我并没有从其他答案中得到我想知道的东西。 这是 Ray Wenderlich iOS 课程

中自定义委托协议的示例代码
protocol AddItemViewControllerDelegate: class {
func addItemViewControllerDidCancel(_ controller: AddItemViewController)
func addItemViewController(_ controller: AddItemViewController, 
didFinishAdding item: ChecklistItem) }

虽然协议的定义很明确,但它是一种必须遵守才能使用的契约。但是这里是在符合class

的主体中实现协议的功能
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 发送到符合要求的委托的协议主体中理解,或者它是一些预定义的函数类型?

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

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

在你的例子中 controller 我猜没有使用参数,因为在这个特定的实现中不需要它。然而,这是代表的一般风格:你说 做了这个动作,什么 是它的主题。在某些情况下,您可能需要知道 AddItemViewController 添加了什么内容。

didFinishAdding 只是帮助您更好地理解函数的签名。

在您的示例中,未使用 "controller",但仅在本例中使用。如果签名中有 属性,则不会强制您使用它:)