Ограничение того, что передается в метод - PullRequest
0 голосов
/ 13 февраля 2012

Верно, скажем, у меня есть метод что-то вроде:

 - (void)doStuff:(NSString *)doStuffWith;

Могу ли я сделать так, чтобы doStuffWith принимал только определенные слова, например, скажем «DoSomething1» и «DoSomething2», поэтому, когда я называю это следующим образом:

 [self doStuff:@"DoSomething1"];

он будет работать, но если я назову его так:

 [self doStuff:@"HelloWorld"];

это даст предупреждение или что-то?

Ответы [ 4 ]

2 голосов
/ 13 февраля 2012

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

typedef enum {
    MyStuffOne,
    MyStuffTwo,
    MyStuffThree
} MyStuff;


- (void)doStuff:(MyStuff)stuff;

Таким образом, вы сможете передать только «MyStuff» (MyStuffOne, MyStuffTwo, MyStuffThree) ... это целые числа, и если вы хотите играть со строками, в вашем методе вы должны сделать что-то вроде:

NSString *string;

    switch (stuff)
    {
      case MyStuffOne:
        string = @"StuffOneString";
      break;

     default:
     ...
    }
2 голосов
/ 13 февраля 2012

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

1 голос
/ 13 февраля 2012

Вы можете создать метод, который проверяет, является ли слово допустимым, а затем утверждать, что метод возвращает true.Это могло бы привести к сбою приложения, если бы программист когда-либо вызывал метод с неверной строкой, но не помогло бы, если бы пользователи могли сами вводить строки.Кроме того, если вы используете настройки проекта по умолчанию, утверждения выполняются только при сборке с конфигурацией Debug.

Например:

static NSSet* __validStrings = nil;

- (BOOL)checkString:(NSString*)string
{
  if( [string length] == 0 ) return NO;

  static dispatch_once_t token;
  dispatch_once(&token, ^{
    // build the list of valid words once, or load from a plist or something
    // if they are very large or change often
    NSArray* validWords = [NSArray arrayWithObjects:@"valid", @"doSomething", @"etc.", nil];
    __validStrings = [[NSSet alloc] initWithArray:validWords];
  });

  return [__validStrings containsObject:string]; 
}

// your doStuff implementation
- (void)doStuff:(NSString*)doStuffWith
{
  // This will crash the program and give you debugging information if doStuffWith
  // is not in your string list
  NSAssert1( [self checkString:doStuffWith], @"invalid string: %@", doStuffWith );

  // continue on with your method implementation...
}
1 голос
/ 13 февраля 2012

Почему бы просто не добавить оператор if в метод, подобный этому

- (void)doStuff:(NSString *)doStuffWith{

  if([doStuffWith isEqualToString:@"DoSomething1"]){

 //do whatever you want here

}else{

 //add your warning here

}

}

Это должно нормально работать

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