2011-04-27 103 views
0

我目前正在學Objective C,並且在這個過程中我做了下面這個愚蠢的小程序。該程序編譯良好 - 但我收到警告「多個方法命名'-setName:'找到」。多種方法警告

我只接口並實現了一次該方法。

這個警告是什麼意思,我該如何糾正?

#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 

回答

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]; 
+2

1。以這種方式思考......如果從現在開始的六個月內,你從未見過的人必須閱讀你的代碼,那麼代碼的哪一行纔會最有意義,並讓讀者最理解你的意圖? – bbum 2011-04-27 06:45:29