我目前正在学习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
Run Code Online (Sandbox Code Playgroud)
消息的含义是setName:在翻译中有多个具有名称的选择器(也就是说,它至少在所有包含的头中的其他位置声明).编译器可能会选择错误的选择器(可能会引入未定义的行为).
您通常可以使用以下一种(或多种)方法纠正问题:
1)将方法重命名为唯一名称:例如setExerciseName,如果不在其他翻译中使用,则可能没问题.
2)匹配另一个选择器的签名.例如setName:(NSString *)name
3)使用类型安全:
Exercise * ex = [Exercise new];
[ex setName:kCobra];
Run Code Online (Sandbox Code Playgroud)
4)将变量强制转换为类型: [(Exercise*)exercise setName:kCobra];
5)使用新变量恢复类型: Exercise * ex = exercise;
因为你已经将var声明为id,所以你已经删除了类型,这意味着对象可以响应任何可见的选择器.一般情况下,除非确实需要,否则不应以这种方式删除类型.
我看到的最佳方法是1和3的组合:
[ex setExerciseName:kCobra];
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1600 次 |
| 最近记录: |