2012-11-07 55 views
5

爲什麼[NSString stringWithFormat]方法返回id類型?從我期待的名字返回一個NSString,而不是一個通用指針。其他班級遵循這個「規則」。例如,[NSNumber numberWithInt]返回NSNumber,而不是idNSString stringWithFormat返回類型,爲什麼它是「ID」?

我認爲它從工廠方法這個事實上來說是沒有道理的。

+1

對於子類。在這種情況下,'NSMutableString'需要強制轉換。 –

+0

是的,我同意 - 你可以圍繞爲什麼它是這樣,但最終它沒有任何意義。 –

回答

6

你提到NSNumber,這並沒有任何直接的子類,所以它是安全的numberWithInt:返回一個NSNumber*

NSString*(和其他類,如NSSet)返回類型id因爲他們可以有子類(NSMutableString和分別爲NSMutableSet),它將繼承此方法。因此,這些繼承的調用需要返回一個子類類型的實例,並且由於方法命名的規則,您不能單獨根據返回類型進行重載。因此,他們之間需要共同的類型,即id

更新:最近的進展意味着關鍵字instancetype現在可用。您可能已經注意到很多id的引用現在替換爲instancetype。該關鍵字向編譯器提供了一種提示,即方法的返回類型與該方法的接收方的類相同。

例如(我強調一個例子,這可能不是在實際的框架的情況下):

NSArray: 
- (instancetype)initWithArray:(NSArray*)array; 

NSMutableArray: 
// Inherits from NSArray 

---- 

// Receiver is NSArray, method belongs in NSArray, returns an NSArray 
[[NSArray alloc] initWithArray:@[]]; 

// Receiver is NSMutableArray, method belongs in NSArray, returns an NSMutableArray 
[[NSMutableArray alloc] initWithArray:@[]]; 
+0

好吧,我從來沒有想過我可以調用[NSMutableString stringWithFormat]。通常我建立一個空的NSMutableString,然後附加格式。我對類的層次結構的理解偏離了Java經驗,其中String不是StringBuilder的超類。 – giampaolo

+0

類的可變版本始終是其具體副本的子類。這對Cocoa來說是有意義的,可變類與具體類相同,添加了一些花裏胡哨的功能以允許它讀寫,而不是隻讀:) – WDUK

+0

@WDUK被挑剔,'NSNumber'是一個類集羣,所以它有很多子類,只是它們是私有的。 –

5

因爲它是類NSString上的一個靜態方法,並且它被假定爲返回被調用的對象的類型。這也取決於類型,因爲它可以來自NSMutableString。