正确的说我有一个类似的方法:
- (void)doStuff:(NSString *)doStuffWith;
我可以这样做,以便doStuffWith只接受某些单词,比如说“DoSomething1”和“DoSomething2”,所以当我把它称为:
[self doStuff:@"DoSomething1"];
它会运行,但如果我称之为:
[self doStuff:@"HelloWorld"];
它会发出警告还是什么?
答案 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...
}