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

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


person Aidar Nugmanov    schedule 01.02.2017    source источник
comment
Откуда вы взяли этот код? Есть ли конкретный учебник Рэя, для которого вы можете указать URL-адрес?   -  person Michael Fourre    schedule 01.02.2017


Ответы (2)


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

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

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

person Vadim Popov    schedule 01.02.2017

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

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

person Bertrand Bloc'h    schedule 01.02.2017