最近的Objective-C编译器引入了'instancetype'关键字,其中包括可用于提供类型集合的关键字。 。 。
我看到了instancetype的另一个目的,它在类的'objectWith'类型方法中使用它。例如:
@interface Car
+(instancetype)carWithWheels:(NSArray*)wheels;
@end
理由是编译器将对initWith方法进行类型检查,但不对'objectWith'方法进行类型检查。
除了可能更容易键入外,使用'instancetype'代替实际的类名有什么好处?例如:
@interface Car
+(Car*)carWithWheels:(NSArray*)wheels;
@end
答案 0 :(得分:35)
通过使用instancetype
,您说子类将返回子类的对象。
如果我们有
@interface Car
+(instancetype)carWithWheels1:(NSArray *)wheels;
+(Car *)carWithWheels2:(NSArray *)wheels;
@end
和
@interface VolkswagenBeetle : Car
@end
然后+[VolkswagenBeetle carWithWheels1:]
保证返回VolkswagenBeetle
的实例;但+[VolkswagenBeetle carWithWheels2:]
可能会返回Buick
,Caddilac
或ChittyChittyBangBang
。
答案 1 :(得分:2)
您可以继承Car
并仍然可以从instancetype中受益。当然你可以使用id来实现这个,但是你会从instancetype中获得松散的类型检查。
我只是在它应该返回当前类的对象(子类返回该子类的对象)的任何地方使用它,特别是在方便方法和东西中。
有一个很棒的answer which could help。