Як я можу передавати кілька параметрів у Objective-C?


178

Я прочитав кілька публікацій про синтаксис методу Objective-C, але, мабуть, я не розумію кількох імен методу.

Я намагаюся створити метод, званий getBusStopsз NSStringі NSTimeIntervalпараметрами та типом повернення NSMutableArray. Ось як я сконструював метод, але він, очевидно, отримує помилки під час виконання:

- (NSMutableArray *)getBusStops:(NSString *)busStop
                                (NSTimeInterval *)timeInterval;

Я бачив ще один приклад із методом:

-(NSInteger)pickerView:(UIPickerView *)pickerView
            numberOfRowsInComponent:(NSInteger)component

Я не розумію, чому цей метод має ім'я методу для кожного параметра. Чи варто робити те саме з чимось на зразок:

- (NSMutableArray *)getBusStops:(NSString *)busStop
                        forTime:(NSTimeInterval *)timeInterval

Відповіді:


120

Objective-C не має іменних параметрів, тому все, що знаходиться в лівій частині двокрапки, є частиною назви методу. Наприклад,

getBusStops: forTime:

- назва методу. Назва розбита, тому вона може бути більш описовою. Ви можете просто назвати свій метод

getBusStops: :

але це не говорить вам багато про другий параметр.


157

Кожне ім'я параметра потрібно розмежувати як мінімум з ":". Технічно назва не є обов'язковою, але рекомендується для читання. Отже, ви можете написати:

- (NSMutableArray*)getBusStops:(NSString*)busStop :(NSSTimeInterval*)timeInterval;

або що ви запропонували:

- (NSMutableArray*)getBusStops:(NSString*)busStop forTime:(NSSTimeInterval*)timeInterval;

15
+1: Аргументи функції Objective-C дійсно є позиційними, не називаються, тому мітка є необов'язковою і для споживання людиною.
Джаррет Харді

не впевнений, чому в підписі віддається перевага "forTime", "timeInterval" може використовуватися як 2-й параметр функції, правда?
галактика

@galactica - Звичайно, ім'я може бути будь-яким, що має для вас найбільш сенс. Цей приклад використовує термінологію ОП для послідовності.
ЕМ

2
Все ще не впевнений, для чого forTimeвикористовується?
mrgloom

71

Так; синтаксис методу Objective-C є таким із кількох причин; одна з них полягає в тому, щоб було зрозуміло, які параметри ви вказуєте. Наприклад, якщо ви додаєте об'єкт до NSMutableArrayпевного індексу, ви зробите це методом:

- (void)insertObject:(id)anObject atIndex:(NSUInteger)index;

Цей метод називається, insertObject:atIndex:і зрозуміло, що об'єкт вставляється з заданим індексом.

На практиці додавання рядка "Привіт, світ!" в індексі 5 NSMutableArrayвиклику arrayбуде називатися так:

NSString *obj = @"Hello, World!";
int index = 5;

[array insertObject:obj atIndex:index];

Це також зменшує неоднозначність між порядком параметрів методу, гарантуючи, що ви спочатку передаєте параметр об'єкта, а потім параметр індексу. Це стає більш корисним при використанні функцій, які беруть велику кількість аргументів, і зменшує помилку при передачі аргументів.

Крім того, метод іменування методу такий, тому що Objective-C не підтримує перевантаження; однак, якщо ви хочете написати метод, який виконує ту саму роботу, але приймає різні типи даних, це може бути досягнуто; візьмемо, наприклад, NSNumberклас; це кілька методів створення об'єктів, включаючи:

  • + (id)numberWithBool:(BOOL)value;
  • + (id)numberWithFloat:(float)value;
  • + (id)numberWithDouble:(double)value;

Мовою, такою як C ++, ви просто перевантажите метод числення, щоб дозволити передавати різні типи даних як аргумент; однак у Objective-C цей синтаксис дозволяє реалізувати кілька різних варіантів однієї і тієї ж функції, змінивши назву методу для кожного варіанта функції.


чи потрібні імена параметрів під час виклику методу (надсилання повідомлення), якщо ім'я функції включає назви параметрів?
Naveen

24

Текст перед кожним параметром є частиною назви методу. З вашого прикладу насправді назва методу

-getBusStops:forTime:

Кожен: представляє аргумент. У виклику методу ім'я методу розділяється на: s, а аргументи з'являються після: seg

[getBusStops: arg1 forTime: arg2]

3
Я думаю, ви забули додати назву методу.
Özgür

11

для створення методу:

-(void)mymethods:(NSString *)aCont withsecond:(NSString *)a-second {
//method definition...
}

для виклику методу:

[mymethods:self.contoCorrente withsecond:self.asecond];

-3
(int) add: (int) numberOne plus: (int) numberTwo ;
(returnType) functionPrimaryName : (returnTypeOfArgumentOne) argumentName functionSecondaryNa

я:

(returnTypeOfSecontArgument) secondArgumentName ;

як і в інших мовах, ми використовуємо наступний синтаксис void, add(int one, int second) але спосіб призначення аргументів в OBJ_cінший, як описано вище

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.