2014-10-08 2 views
2

Я начинаю с Swift, разрабатывая простое приложение с tableView, запрос на сервер и многое другое. Я понял, что каждый метод внутри UITableViewDelegate-протокола назван таким же образом (я думаю, он может быть одинаков с другими протоколами), и различия производятся путем изменения параметров, переданных этим методам (которые, кстати, называются «tableView») ,Почему все методы имеют одно и то же имя в делегате?

Мне было интересно, почему Apple будет делать что-то вроде этого, так как это немного беспорядочно, когда я пытаюсь реализовать метод из этого протокола, так как я не могу начать вводить «didSele ...» только для автозаполнения с помощью «didSelectRowAtIndexPath», ; вместо этого мне нужно набрать «tableView», чтобы получить список всех доступных методов и вручную найти тот, второй параметр которого «didSelectRowAtIndexPath».

Все работает нормально, но просто пытается понять, ПОЧЕМУ это можно сделать таким образом.

Спасибо так много советов :)

PS: Там скриншот о том, что я хочу сказать:

Image showing a list of "tableView" functions with different parameters names

ответ

2

Swift предназначен для совместимости с Objective-C. В конце концов, почти все существующие API OS X и iOS находятся в Objective-C и C (с небольшим количеством кода на C++ здесь и там). Swift должен иметь возможность использовать эти API и, таким образом, поддерживать большинство объектов Objective-C так или иначе. Одной из наиболее важных особенностей Objective-C является способ вызова методов.

Например, в C, функция с 3 аргументами называется так:

foo(1, "bar", 3); 

Вы не знаете, что аргументы должны быть. Таким образом, в Objective-C аргументы чередуются с именем метода. Например, имя метода может быть fooWithNumber:someString:anotherNumber: и она будет называться как:

[anObject fooWithNumber:1 someString:@"bar" anotherNumber:3]; 

Swift в настоящее время пытается быть совместимым с этой функцией Objective-C. Таким образом, он поддерживает форму именованных аргументов. Звонок в Swift будет выглядеть так:

anObject.foo(number:1, someString:@"bar", anotherNumber:3) 

определение Часто Swift метод написано так, что вам не нужно явно назвать первый аргумент, как:

anObject.foo(1, someString:@"bar", anotherNumber:3) 

Если вы заметили UITableViewDelegate protocol documentation и выберите Objective-C, вы увидите, что все эти методы начинаются с tableView:, чтобы назначить отправителя, но с тех пор они очень разные. Список, который вы указали, является результатом преобразования из соглашения о назначении Objective-C в Swift.

1

Это просто именования. То же самое в Objective-C. Вы можете посмотреть на это page. Без этих соглашений это было бы полным беспорядком.

+0

Отличная ссылка, я полностью забыл, что она все еще существует ... но это всего лишь половина истории. Другая часть - это то, как эти имена объектов Objective-C переводятся в Swift. – DarkDust

1

Имя метода - это не только первое слово, но и общедоступные имена параметров.

E.g. это имя метода не tableView(), но tableView(_:didSelectRowAtIndexPath:).

Смежные вопросы