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