从使用instancetype的类构造函数返回子类是否可以?

时间:2013-05-25 20:12:19

标签: objective-c cocoa constructor return-type instancetype

我在类别中有一个类方法,以某种方式构建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:]时返回不可变副本?

1 个答案:

答案 0 :(得分:2)

一切都很好:

NSIndexSet *set = [[NSIndexSet WSSIndexSetFromMask:0] addIndex:0];

No visible @interface for 'NSIndexSet' declares the selector 'addIndex:'

instancetype对发件人说,即使是子类型,也会返回接收者类型的实例。对于发送者,它是NSIndexSet,因为它被发送到NSIndexSet的类对象。

这样一种内省,即有人看到返回类型并查看子类并从这些信息中获取任何优势,这种方式是错误的。合同是使用返回类型构建的,在本例中为NSIndexSet。