'objectWith'方法中'instancetype'关键字的用途?

时间:2013-04-23 06:29:49

标签: objective-c

最近的Objective-C编译器引入了'instancetype'关键字,其中包括可用于提供类型集合的关键字。 。 。

我看到了instancetype的另一个目的,它在类的'objectWith'类型方法中使用它。例如:

@interface Car

    +(instancetype)carWithWheels:(NSArray*)wheels;

@end

理由是编译器将对initWith方法进行类型检查,但不对'objectWith'方法进行类型检查。

除了可能更容易键入外,使用'instancetype'代替实际的类名有什么好处?例如:

@interface Car

    +(Car*)carWithWheels:(NSArray*)wheels;

@end

2 个答案:

答案 0 :(得分:35)

通过使用instancetype,您说子类将返回子类的对象。

如果我们有

@interface Car

    +(instancetype)carWithWheels1:(NSArray *)wheels;
    +(Car *)carWithWheels2:(NSArray *)wheels;

@end

@interface VolkswagenBeetle : Car

@end

然后+[VolkswagenBeetle carWithWheels1:]保证返回VolkswagenBeetle的实例;但+[VolkswagenBeetle carWithWheels2:]可能会返回BuickCaddilacChittyChittyBangBang

答案 1 :(得分:2)

您可以继承Car并仍然可以从instancetype中受益。当然你可以使用id来实现这个,但是你会从instancetype中获得松散的类型检查。 我只是在它应该返回当前类的对象(子类返回该子类的对象)的任何地方使用它,特别是在方便方法和东西中。

有一个很棒的answer which could help