限制传递给方法的内容

时间:2012-02-13 14:36:26

标签: iphone objective-c xcode4 ios5

正确的说我有一个类似的方法:

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

我可以这样做,以便doStuffWith只接受某些单词,比如说“DoSomething1”和“DoSomething2”,所以当我把它称为:

 [self doStuff:@"DoSomething1"];

它会运行,但如果我称之为:

 [self doStuff:@"HelloWorld"];

它会发出警告还是什么?

4 个答案:

答案 0 :(得分:2)

如果需要限制可能值的数量,则应使用枚举数据类型而不是NSString

答案 1 :(得分:2)

您应该使用枚举,例如:

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 :(得分:1)

为什么不在这个方法中添加if语句

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

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

 //do whatever you want here

}else{

 //add your warning here

}

}

应该可以正常工作

答案 3 :(得分:1)

您可以创建一个方法来检查单词是否有效,然后断言该方法返回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...
}