2012-04-23 30 views
0

我有一個對象必須是內部不同的類型,但我總是希望返回一個字符串。所以我將對象聲明爲'id'並且寫了一個總是返回NSString *的getter方法。一切正常,XCode抱怨「屬性類型'X'與預期的訪問者類型'setX:''不匹配。既然我確實需要這種行爲,是否有人知道如何告訴XCode,我確實需要這個,而不是一直看到這個警告?有點像未使用變量的「__unused」指令?如何禁用訪問者返回類型警告?

謝謝! 最大

編輯:下面的代碼

.H

@property (strong,nonatomic) id wert; 
- (void) setWert:(NSString *)value; 
- (NSString *) wert; 

.M

@synthesize wert; 

- (void) setWert:(NSString *)value 
{ 
     wert = value; 
} 

- (NSString *) wert 
{ 
     return wert; 
} 
+0

你能發佈你有問題的代碼嗎? – Jim 2012-04-23 22:45:23

+0

我似乎無法重新創建此錯誤。你能發佈代碼和確切的錯誤信息嗎? – joerick 2012-04-23 22:49:34

+0

在原始文章中添加了代碼示例。錯誤信息是「屬性類型'wert'與訪問者類型不匹配'setWert:'」 – Max 2012-04-23 23:09:25

回答

-1

設置的NSString *id類型屬性不會導致警告,但設置了id類型VAR到NSString *屬性會......你可以用一個類型轉換解決...

id someVar = @"string"; 
someObject.setStringProperty = (NSString *)someVar; 
0

問題就出在這幾行:

@interface TestClass : NSObject 

@property (strong, nonatomic) id wert; 

- (void) setWert:(NSString *)value; 
- (NSString *) wert; 

@end 

從本質上講,@property符號是宣告速記訪問器方法(具有一些屬性,誠然)。所以在這裏首先聲明它爲id,然後作爲NSString是沒有意義的。決定要爲wert公開的類型,並將其用於屬性聲明。我建議:

@interface TestClass : NSObject 

@property (strong, nonatomic) id wert; 

@end 

此外,在.m,首先@synthesize屬性,然後覆蓋getter和setter。這意味着你從@synthesize得到的唯一東西就是實例變量。

您也可以在@implementation塊中聲明實例變量。這將是一個很好的地方爲你聲明的內部類型:

@implementation TestClass 
{ 
    NSString *wert; 
} 

不過,如果你是幸福的其他類調用setWert:比NSString的任何其他,你不應該更改類型聲明二傳手。這樣做會假設value是一個NSString。所以你的訪問者應該看起來像這樣:

- (void) setWert:(id)value 
{ 
    // store wert as an NSString 
} 

- (id) wert 
{ 
    // return wert as the original type 
} 

@end 
+0

非常感謝,我誤解了@property做了什麼。即使如此,在'@ implementation'中聲明實例變量爲'id wert'導致與''NSInvalidArgumentException'崩潰,原因:' - [__ NSCFString stringValue]:無法識別的選擇器發送到實例...''。我不知道爲什麼這不起作用,但之前的做法。 至於訪問器方法,'value'總是字符串,對於外界來說,'wert'應該看起來像一個NSString,但是在內部,它應該是一堆不同的對象 - 從NSInteger到NSDate 。也許這並不理想,但爲什麼它在那之前工作? – Max 2012-04-24 17:40:33

+0

好吧,看起來我有錯誤的方式。將該屬性聲明爲NSString(包括setter和getters),然後將實例變量聲明爲'id'。至於你的崩潰,這是一個不同的問題,你必須在某處改變你的邏輯。 – joerick 2012-04-25 08:33:19

+0

這也行不通,然後我在getter方法的其他地方得到了錯誤:「'NSString'沒有可見的@interface聲明選擇器'decimalValue'」。這有點奇怪。也許我應該接受警告,但我真的很感謝你的幫助! – Max 2012-04-25 11:46:11