我目前正在学习Objective C,在这个过程中,我已经制作了下面的愚蠢的小程序。程序编译得很好 - 但是我收到警告“多个方法名为'-setName:'found”。
我只接口并实现了一次该方法。
这个警告意味着什么,我该如何纠正?
#import <Foundation/Foundation.h>
// these are the three yoga-exercises we can perform
typedef enum {
kCobra,
kUniversal,
kDog
} ExerciseName;
// translating our variables into human
NSString *nameExercise (ExerciseName nameExercise)
{
switch (nameExercise) {
case kCobra:
return @"Cobra Pose";
break;
case kUniversal:
return @"Universal Stretch";
break;
case kDog:
return @"Dog Pose";
break;
}
return @"no clue!";
} // nameExercise
@interface Exercise : NSObject
{
ExerciseName name;
}
-(void) setName: (ExerciseName) name;
-(void) exerciseDo;
@end
@implementation Exercise
-(void) setName: (ExerciseName) n {
name = n;
} // setName
-(void) exerciseDo {
NSLog(@"Exercise: %@",
nameExercise(name));
}
@end
void executeExercises(id exercises[], int count) {
int i;
for(i=0; i<count; i++) {
id exercise = exercises[i];
[exercise exerciseDo];
}
}
int main (int argc, const char * argv[]) {
id exercises[1];
exercises[0] = [Exercise new]; // initiating an object of class Exercise
[exercises[0] setName:kDog];
executeExercises(exercises, 1);
return 0;
} //main
答案 0 :(得分:5)
消息的含义是翻译中有多个名称为setName:
的选择器(也就是说,它至少在所有包含的头中的其他位置声明)。编译器可能会选择错误的选择器(可能会引入未定义的行为)。
您通常可以使用以下一种(或多种)方法纠正问题:
1)将方法重命名为唯一名称:例如如果不在其他翻译中使用,setExerciseName
可能没问题。
2)匹配另一个选择器的签名。例如setName:(NSString *)name
3)使用类型安全:
Exercise * ex = [Exercise new];
[ex setName:kCobra];
4)将变量强制转换为类型:[(Exercise*)exercise setName:kCobra];
5)使用新变量恢复类型:Exercise * ex = exercise;
因为你已经将var声明为id
,所以你已经删除了类型,这意味着该对象可以响应任何可见的选择器。一般情况下,除非真的有必要,否则不应以这种方式删除类型。
我看到的最佳方法是1和3的组合:
[ex setExerciseName:kCobra];