2013-11-26 44 views
0

我是Objective C的初學者,試圖編寫一個簡單的程序來打印一個人的出生年份,但是有一個錯誤「找到了多個名爲setYear的方法不匹配的結果「,任何人都可以幫我弄清楚爲什麼會發生?多個方法命名'setYear'找到了不匹配的結果

//person.h 
@interface person : NSObject 
@property int year; 
+ (id)person; 
@property (readonly) NSString* summary; 
@end 

// main.m 
#import "person.h" 
@implementation person 
@synthesize year; 
+ (id)book{ 
    person *somePerson = [[self alloc] init]; 
    return somePerson; 
} 

- (NSString*)summary{ 
    NSNumber* yearAsObject; 
    yearAsObject = [NSNumber numberWithInteger:self.year]; 
    return [NSString stringWithFormat:@"Borned in %@.", yearAsObject]; 
} 
@end 

int main(){ 
    @autoreleasepool { 
     id aperson = [person person]; 
     [aperson setYear:@1970]; 
     NSLog (@"Birth year: %@", [aperson summary]); 
    } 
return 0; 

}

+1

一個錯誤是,* year *是一個int屬性。但是你傳遞* NSNumber *到* setYear:*方法。 – EmptyStack

+0

嗨@EmptyStack,如何爲年份賦值?謝謝。 – wuyefeibao

+0

將該行更改爲*** [aperson setYear:1970]; ***。請注意,@被刪除。 – EmptyStack

回答

3

如果你知道你將在那裏放置哪種類型,那麼在變量上使用id類型是一個糟糕的主意。這是因爲通過使用id而不是真正的類名,編譯器根本不知道執行什麼樣的理智檢查。

在這種特殊情況下,編譯器看到的方法setYear:但因爲它不知道它應該是一個person對象(請堅持Objective-C的命名規則和重命名類Person代替),它查找全部方法調用setYear:它可以找到。它會找到您的int類型的財產,但它也會找到-[NSDateComponents setYear:],它預計NSInteger,它可以是intlong。如果你正在構建64位,它將是一個long

所以,現在編譯器知道存在兩種方法setYear:,一個預計int,另一個long。由於aperson的類型是id,編譯器不知道你的意思。

有兩個解決方案:要麼把投在通話中[(person *)aperson setYear:1970](通過@1970,這是一個NSNumber,是錯在這裏)。更好的解決方案是實際告訴編譯器你的意圖並指定正確的變量類型:

person *aperson = [person person]; 
[person setYear:1970]; 
+0

你的解釋很清楚!非常感謝! – wuyefeibao

1

您可以通過糾正setYear:方法調用解決這個問題。你在main方法的代碼應該如下:

int main(){ 
    @autoreleasepool { 
     id aperson = [person person]; 
     [(person*)aperson setYear:1970]; 
     NSLog (@"Birth year: %@", [aperson summary]); 
    } 
return 0; 
} 

你的問題得到通過正確類型的發送者(人*在這種情況下)的替代ID解決,因爲編譯器就知道該發件人是一個實例人類,因此知道哪個方法適用於此。

+0

Hi @Vinay Jain,如果我將'year'屬性更改爲'NSNumber',但是如果它是'int',則此解決方案無效。 – wuyefeibao

+0

它會工作,只需從數字「1970」中刪除「@」即可。 –

+0

它的工作原理,謝謝!但我仍然不明白爲什麼。例如,如果我有一個屬性'@property NSString * name;',爲什麼我可以使用'[aperson setName:@「Tom」];'來設置,但對於我不能 – wuyefeibao

相關問題