将__kindof与非集合类型

时间:2016-04-14 17:21:48

标签: objective-c

Xcode 7 added __kindof装饰器到对象声明:

  

KindOf。声明为__kindof类型的对象向编译器表达“某种X”,并且可以在泛型参数中用于将类型约束到特定类或其子类。使用__kindof允许约束比显式类更灵活,并且比仅使用id更明确。

__kindof最明显的用例是使用集合类型来明确说明特定集合中的对象类型。来自UIStackView标题:

- (instancetype)initWithArrangedSubviews:(NSArray<__kindof UIView *> *)views; // Adds views as subviews of the receiver.
@property(nonatomic,readonly,copy) NSArray<__kindof UIView *> *arrangedSubviews;

这明确指出每个NSArray将包含来自UIView的对象或继承自的对象。

但是在某些情况下,__kindof用于非集合类型的对象,例如UIStoryboardSegue标题:

@property (nonatomic, readonly) __kindof UIViewController *sourceViewController;
@property (nonatomic, readonly) __kindof UIViewController *destinationViewController;

__kindof装饰器在非集合类型对象上有什么变化?

1 个答案:

答案 0 :(得分:4)

最明显的情况是投射类型:

UIViewController *vc = [[UIViewController alloc] init];
// SomeViewController inherits from UIViewController
SomeViewController *someViewController = vc; // Warning: Incompatible pointer type initializing 'SomeViewController *' with an expression of type 'UIViewController *'

__kindof UIViewController *otherVC = [[UIViewController alloc] init];
SomeViewController *someVC = otherVC; // no warning

这就是为什么在UIViewController的{​​{1}}方法中,将prepareForSegue转换为另一个segue.destinationViewController子类不会显示警告:

UIViewController