Сигнатуры метода Objective-C.Они противоречивы? - PullRequest
15 голосов
/ 11 октября 2010

Я новичок в Objective-C, но, пожалуйста, помогите мне здесь.

Я вижу, что сигнатуры методов в Objective-C, которые принимают несколько параметров, кажутся непоследовательными.

Пример:

- (void) sendEmail: (NSString *) toStr
         subject:(NSString *) subjectStr
         body:(NSString *) bodyStr;

ОК, так что здесь у нас есть 3 «параметра» (по крайней мере, так я их называю), но у 2 из них есть «внешние» имена (субъект, тело), ​​а у первого нет! Не правда ли, что с точки зрения последовательности / стиля что-то не так?

Когда мы вызываем этот метод, мы делаем это следующим образом:

[emailObj sendEmail:@"test@test.com" subject:@"testSub" body:@"this is a test"]

(Надеюсь, я сделал это правильно, помните, что я новичок в этом.)

Таким образом, субъект и тело четко обозначены в вызове, но не адрес «до»? Похоже, это по-настоящему ошеломило меня. Почему этот первый параметр получает специальное лечение?

Ответы [ 3 ]

14 голосов
/ 11 октября 2010

Полагаю, вы подумали, что в объявлении метода

-(void) A:(NSObject*)a B:(NSObject*)b C:(NSObject*)c

A - это имя метода, B и C - это имена параметров.

В Objective-C совокупность A:B:C: является именем метода (более технически, называемым селектором ) и используется в качестве единицы при вызове метода по имени.Например,

 if([obj respondsToSelector:@selector(A:B:C:)]){
     ...
 }

проверяет, отвечает ли obj на A:B:C:.Но [obj respondsToSelector:@selector(A:)] в этом случае будет NO.

Таким образом, вам действительно следует думать о совокупности A:B:C: как имени метода, а A - имени первого параметра.

Обратите внимание, что вы также не можете назвать A:B:C: как A:C:B:.

12 голосов
/ 11 октября 2010

В большинстве случаев такие методы обычно называются так, что отсутствие имени в первом параметре имеет смысл.В этом случае я бы ожидал что-то вроде sendEmailTo.

10 голосов
/ 11 октября 2010

Я бы сказал, что если вы не понимаете, что делает метод, то он, вероятно, не назван так, как мог бы.

Учитывая селектор выше, я бы ожидал, что 3 параметра будут своего рода объектом электронной почты, темой и телом. Однако, поскольку первый параметр не является объектом «Электронная почта», а является получателем электронной почты, я бы, вероятно, переименовал этот метод в:

- (void) sendEmailToRecipient:(NSString *)recipient subject:(NSString *)subject body:(NSString *)body;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...