爲什麼[NSString stringWithFormat]
方法返回id
類型?從我期待的名字返回一個NSString
,而不是一個通用指針。其他班級遵循這個「規則」。例如,[NSNumber numberWithInt]
返回NSNumber
,而不是id
。NSString stringWithFormat返回類型,爲什麼它是「ID」?
我認爲它從工廠方法這個事實上來說是沒有道理的。
爲什麼[NSString stringWithFormat]
方法返回id
類型?從我期待的名字返回一個NSString
,而不是一個通用指針。其他班級遵循這個「規則」。例如,[NSNumber numberWithInt]
返回NSNumber
,而不是id
。NSString stringWithFormat返回類型,爲什麼它是「ID」?
我認爲它從工廠方法這個事實上來說是沒有道理的。
你提到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:@[]];
因爲它是類NSString上的一個靜態方法,並且它被假定爲返回被調用的對象的類型。這也取決於類型,因爲它可以來自NSMutableString。
對於子類。在這種情況下,'NSMutableString'需要強制轉換。 –
是的,我同意 - 你可以圍繞爲什麼它是這樣,但最終它沒有任何意義。 –