我在类别中有一个类方法,以某种方式构建Cocoa集合,而内置的初始化程序不允许这样做。由于初始化程序功能有限,我必须使用集合的可变版本来实际构建它。以下是NS{Mutable}IndexSet
的示例:
@implementation NSIndexSet (WSSNonContiguous)
+ (instancetype)WSSIndexSetFromMask:(NSUInteger)mask
{
NSMutableIndexSet * set = [NSMutableIndexSet indexSet];
for( NSUInteger i = 0; i < (sizeof(NSUInteger) * 8); i++ ){
if( mask & (1l << i) ){
[set addIndex:i];
}
}
return set;
}
我的返回类型有时候就是谎言 - 无论用户是否请求不可变版本,都会返回 mutable 集合。
在这种情况下使用instancetype
是否仍然合适,或者我应该使用id
?如果我使用instancetype
,我是否还应该明确地重新创建集合:
// Ick?
return [[self alloc] initWithIndexSet:set];
确保在呼叫为+[NSIndexSet WSSIndexSetFromMask:]
时返回不可变副本?
答案 0 :(得分:2)
一切都很好:
NSIndexSet *set = [[NSIndexSet WSSIndexSetFromMask:0] addIndex:0];
No visible @interface for 'NSIndexSet' declares the selector 'addIndex:'
instancetype
对发件人说,即使是子类型,也会返回接收者类型的实例。对于发送者,它是NSIndexSet,因为它被发送到NSIndexSet的类对象。
这样一种内省,即有人看到返回类型并查看子类并从这些信息中获取任何优势,这种方式是错误的。合同是使用返回类型构建的,在本例中为NSIndexSet。