2012-10-17 79 views
0

我是新來的客觀,只是試圖理解簡單的概念。 我已經閱讀Objective C for傻瓜和Mac OSX的可可編程(大部分)。 我試圖自己製作一個簡單的小程序,並意識到我知道的很少。我不斷收到"Use of Undeclared Identifier "calculateAge', did you mean 'Calculate' "錯誤。使用未聲明的標識符'calculateAge'

任何人都可以告訴我下面的代碼有什麼問題,爲什麼? 預先感謝一堆。

#import <Foundation/Foundation.h> 


@interface Calculate : NSObject 
{ 
    int myYear; 
    int nowYear; 
} 


- (int) calculateAge:(int)birthYear:(int)nowYear; 

@end 



@implementation Calculate 



- (int) calculateAge:(int)birthYear:(int)nowYear// need myYear 
{ 

    NSLog(@"The birthYear is: %i\n", birthYear); 
    int myAge = nowYear - birthYear;   
    //NSLog(@"The nowYear is: %i\n", nowYear); 
    NSLog(@"The age is: %i\n", myAge); 
    return myAge; 
} 



int main(int argc, const char * argv[]) 
{ 

    @autoreleasepool { 


     NSLog(@"Hello, World!"); 
     int myY = 1963; 
     int nowY = 2012; 
     int myYear = 1963; 
     int nowYear = 2012; 
     //int myAge = calculateAge:(int) birthYear: (int) nowYear; 
     int myAge = calculateAge:(int) myY: (int) nowY; 
     NSLog(@"The nowYear is: %i\n", nowYear); 
     NSLog(@"The age is: %i\n", myAge); 

    } 
    return 0; 
} 
@end 
+0

什麼編譯器說**完全**。 (我的意思是錯誤)。 – elyashiv

+0

您是否需要將calculateAge信號發送到您的Calculate類的實例? –

回答

1

您似乎在將方法名稱與參數列表混合在一起。一個適當的簽名會是這個樣子:

- (int)calculateAgeFromBirthYear:(int)birthYear currentYear:(int)currentYear 

這可能再像這樣實現:

- (int)calculateAgeFromBirthYear:(int)birthYear currentYear:(int)currentYear 
{ 

    NSLog(@"The birthYear is: %i\n", birthYear); 
    int myAge = currentYear - birthYear;   
    //NSLog(@"The nowYear is: %i\n", currentYear); 
    NSLog(@"The age is: %i\n", myAge); 
    return myAge; 
} 

這可能然後這樣調用:

Calculate *calculator = [[Calculate alloc] init]; 
int myAge = [calculator calculateAgeFromBirthYear:myY currentYear:nowY]; 

不執行main裏面的一個類的實現;它屬於全局命名空間的外部,最好在其自己的文件中。

+0

Warrenm死了,似乎我很困惑放在哪裏以及爲什麼。你的修補程序取得了訣竅。我想是時候繼續閱讀了。謝謝!!! – Shera

0

沒有必要在接口中聲明實例變量。
最後@end需要在主函數之前,它不是類的一部分,它使用了類。
需要對Calculate類進行實例化,並且需要對實例化的類進行調用。
calculateAge...方法應重命名以指示每個參數。
變量應該給全名,abreviations通常最終使事情不太清楚。

下面是一個例子:

@interface Calculate : NSObject 
- (int) calculateAgeWithBirthYear:(int)birthYear nowYear:(int)nowYear; 
@end 

@implementation Calculate 
- (int) calculateAgeWithBirthYear:(int)birthYear nowYear:(int)nowYear// need myYear 
{ 
    NSLog(@"The birthYear is: %i\n", birthYear); 
    int myAge = nowYear - birthYear; 
    NSLog(@"The age is: %i\n", myAge); 
    return myAge; 
} 
@end 

int main(int argc, const char * argv[]) 
{ 
    @autoreleasepool { 

     NSLog(@"Hello, World!"); 

     int myBirthYear = 1963; 
     int nowYear = 2012; 

     Calculate *calculator = [[Calculate alloc] init]; 
     int myAge = [calculator calculateAgeWithBirthYear:myBirthYear nowYear:nowYear]; 

     NSLog(@"The nowYear is: %i\n", nowYear); 
     NSLog(@"The age is: %i\n", myAge); 

    } 
    return 0; 
} 

的NSLog輸出:

你好,世界!
的birthYear是:1963年
的年齡:49
的nowYear是:2012
的年齡:49

使用`@財產〜語句創建實例變量:

@interface Calculate : NSObject 
@property int myYear; 
@property int nowYear; 

- (int) calculateAge; 
@end 

@implementation Calculate 
- (int) calculateAge // need myYear 
{ 
    NSLog(@"The birthYear is: %i\n", self.myYear); 
    int myAge = self.nowYear - self.myYear; 
    NSLog(@"The age is: %i\n", myAge); 
    return myAge; 
} 
@end 

int main(int argc, const char * argv[]) 
{ 
    @autoreleasepool { 

     NSLog(@"Hello, World!"); 

     Calculate *calculator = [[Calculate alloc] init]; 
     calculator.myYear = 1963; 
     calculator.nowYear = 2012; 

     int myAge = [calculator calculateAge]; 

     NSLog(@"The nowYear is: %i\n", calculator.nowYear); 
     NSLog(@"The age is: %i\n", myAge); 

    } 
    return 0; 
} 
+0

接口中的實例變量最初被放置,因爲我發展我的簡單程序我將從用戶輸入引入變量。用戶將輸入出生年份,我將從計算機中獲得當前年份,然後計算年齡。所有在適當的時候,我很慢,但想看看屏幕上的東西。謝謝 – Shera

+0

在這種情況下,使用它們而不是傳入值。 – zaph