0

我提前为提出这样一个愚蠢的问题道歉,但我并没有从其他答案中得到我想知道的东西。这是来自 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)
}

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

4

2 回答 2

0

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

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

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

于 2017-02-01T19:51:28.400 回答
0

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

在您的示例中,未使用“控制器”,但仅在这种情况下使用。如果一个属性在签名中,你不会被迫使用它:)

于 2017-02-01T20:03:49.807 回答