Подтвердить что ты не робот

Дополнительные аргументы в Objective-C 2.0?

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

[aFraction print];

а также:

[aFraction print: someParameter];

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

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

Update: Хорошо, я просто сделал два метода, оба назвали "печать".

заголовок

-(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];
    ...

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

4b9b3361

Ответ 1

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

- (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;

Ответ 2

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

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

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

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

Ответ 3

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

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

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

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

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

Ответ 4

Немного связанные, у вас могут быть необязательные аргументы. Если вы хотите, вы можете вызвать метод с любым количеством аргументов. Но это особенность от 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.

Ответ 5

Чтобы избежать проблемы с 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