Не полностью понимая концепцию пользовательских протоколов, Swift 3

Я заранее извиняюсь за то, что задал такой глупый вопрос, но я не совсем понял, что хотел узнать из других ответов. Вот пример кода пользовательского протокола делегата из курса 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 - это просто внешнее имя для элемента внутреннего аргумента. Но как это работает, как из тела протокола можно понять, что контроллер с именем AddItemViewController отправляет ChecklistItem соответствующему делегату, или это какой-то предопределенный тип функции?

2 ответа

Решение

Здесь мы поговорим о соглашении о стиле кода Swift.

didFinishAdding является описанием аргумента, которое делает более понятным для вызывающей стороны, чтобы понять, что это должно быть. Конечно, вы видите, что тип второго аргумента ChecklistItem, но для того, чтобы разработчик не запутался, вы сделаете это краткое объяснение, какой именно элемент должен быть передан в функцию.

В вашем примере controller Я полагаю, аргумент не используется, потому что в этой конкретной реализации он не нужен. Тем не менее, это общий стиль делегатов: вы говорите, кто совершил акцию и что является ее предметом. Возможен случай, когда вам нужно будет знать, что AddItemViewController добавил предмет.

didFinishAdding - это просто помощник для лучшего понимания сигнатуры функции.

В вашем примере "контроллер" не используется, но это только в этом случае. если свойство находится в подписи, вы не обязаны его использовать:)

Другие вопросы по тегам