11

最近的 Objective-C 编译器引入了“instancetype”关键字,除其他外,它可用于提供类型化集合。. .

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

@interface Car

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

@end

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

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

@interface Car

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

@end
4

2 回答 2

35

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

如果我们有

@interface Car

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

@end

@interface VolkswagenBeetle : Car

@end

then+[VolkswagenBeetle carWithWheels1:]保证返回VolkswagenBeetle;的实例 但+[VolkswagenBeetle carWithWheels2:]可能会返回 a Buick、 aCaddilac或 a ChittyChittyBangBang

于 2013-04-23T06:50:04.467 回答
2

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

有一个很好的答案可以提供帮助

于 2013-04-23T06:39:04.230 回答