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
装饰器在非集合类型对象上有什么变化?
答案 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