NSString stringWithFormat返回类型,为什么它是“id”?
为什么方法[NSString stringWithFormat]
返回id
类型? 从我期望的名称,它返回NSString
,而不是通用指针。 其他课程遵循这个“规则”。 例如, [NSNumber numberWithInt]
返回NSNumber
,而不是id
。
我认为从工厂方法这样的事实来说甚至都不合理。
你提到NSNumber
,它没有任何直接的子类,所以它对numberWithInt:
是安全的numberWithInt:
返回一个NSNumber*
NSString*
(和其他类,如NSSet
)返回类型id
因为它们可以有子类(分别是NSMutableString
和NSMutableSet
),它们将inheritance此方法。 因此,这些inheritance的调用需要返回子类的类型的实例,并且由于方法命名的规则,您不能仅基于返回类型进行重载。 因此,他们需要一个共同的类型,这是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。