Необязательные аргументы в Objective-C 2.0? - PullRequest
51 голосов
/ 18 февраля 2009

В Objective-C 2.0 возможно ли создать метод, в котором аргумент является необязательным? То есть вы можете вызвать метод следующим образом:

[aFraction print];

а также это:

[aFraction print: someParameter];

в той же программе.

Apple Язык программирования Objective-C 2.0 Руководство противопоставляет Obj-C Python и, кажется, говорит, что это запрещено. Я все еще учусь и хочу быть уверенным. Если это возможно , то каков синтаксис, потому что мой второй пример кода не работает.

Обновление: Хорошо, я только что сделал два метода, оба с именем "print".

заголовок

-(void) print;
-(void) print: (BOOL) someSetting; 

реализация

-(void) print {
    [self print:0];
}

-(void) print: (BOOL) someSetting {
    BOOL sv;
    sv = someSetting;

    if ( sv ) {
        NSLog(@"cool stuff turned on");
    }
    else {
        NSLog(@"cool stuff turned off");
    }
}

соответствующие строки программы

    ...
    printParamFlag = TRUE;

// no parameter
    [aCodeHolder print];

// single parameter
    [aCodeHolder print:printParamFlag];
    ...

Не могу поверить, что это сработало. Есть ли причина, по которой я не должен этого делать?

Ответы [ 5 ]

79 голосов
/ 18 февраля 2009

Вы можете объявить несколько методов:

- (void)print;
- (void)printWithParameter:(id)parameter;
- (void)printWithParameter:(id)parameter andColor:(NSColor *)color;

В реализации вы можете сделать это:

- (void)print {
    [self printWithParameter:nil];
}

- (void)printWithParameter:(id)parameter {
    [self printWithParameter:nil andColor:[NSColor blackColor]];
}

Edit:

Пожалуйста, не используйте print и print: одновременно. Во-первых, он не указывает, что это за параметр, и, во-вторых, никто (ab) не использует Objective-C таким образом. Большинство фреймворков имеют очень четкие имена методов, и это единственная вещь, которая делает Objective-C настолько безболезненным для программирования. Обычный разработчик не ожидает такого рода методов.

Есть лучшие имена, например:

- (void)printUsingBold:(BOOL)bold;
- (void)printHavingAllThatCoolStuffTurnedOn:(BOOL)coolStuff;
16 голосов
/ 19 февраля 2009

То, как вы это сделали, является правильным способом сделать это в Objective-C. Он широко используется в самом Какао. Например, некоторые из инициализаторов NSString:

– initWithFormat:  
– initWithFormat:arguments:  
– initWithFormat:locale:  
– initWithFormat:locale:arguments:

Причина, по которой это работает, заключается в том, что : является частью имени метода, поэтому для компилятора print и print: - это совершенно разные сообщения, которые не более тесно связаны, чем "печать" и "спринт".

Однако, конкретные имена методов, которые вы дали, не очень подходят для этого, потому что из названия неясно, что это за параметр (или что означает «печать»), если параметр является тем, что печатает объект ). Было бы лучше, скажем, printFalseMessage и printMessageWithFlag:.

7 голосов
/ 20 февраля 2009

Другой вариант для нескольких необязательных аргументов - передать их все в NSDictionary:

- (void)someMethodWithOptions:(NSDictionary *)options;

затем объявите, что словарь опций может содержать:

- key1, value must be a BlahObject
- key2, value must be a NonBlahObject

тогда вы можете позволить любому из ключей отсутствовать, и даже сам словарь может быть равен нулю.

5 голосов
/ 19 февраля 2009

Слегка связанные вы можете иметь необязательные аргументы. Это означает, что вы можете вызвать метод с любым количеством аргументов, если хотите. Но это особенность C (varargs).

Примером является сообщение NSArray :

+ (id)arrayWithObjects:(id)firstObj, ...

Пример использования:

NSArray *myArray;
NSDate *aDate = [NSDate distantFuture];
NSValue *aValue = [NSNumber numberWithInt:5];
NSString *aString = @"a string";

myArray = [NSArray arrayWithObjects:aDate, aValue, aString, nil];

Это прямо из документов Apple. Вы указываете конец всех своих аргументов с помощью nil .

1 голос
/ 15 февраля 2013

Чтобы избежать проблемы Parse: «aVariable» используется как имя предыдущего параметра, а не как часть селектора , который вы получаете от компилятора в качестве предупреждения, которое вы должны сделать:

- (void)printWithParameter:(BOOL)sv color:(NSColor *)color{
   // your cool code goes here
   if ( sv ) {
      NSLog(@"cool stuff turned on");
   }
   else {
      NSLog(@"cool stuff turned off");
   }
}

и вы можете вызвать метод, например:

[self printWithParameter:NO color:[UIColor someColor]] // NO instead of 0

или

[self printWithParameter:YES color:[UIColor someColor]] // YES instead of 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...