我有这个财产:
@property (nonatomic) NSMutableArray <__kindof superclass*> *items;
我用子类的对象填充它(由于__kindof应该没问题)。我这样检索数组:
NSMutableArray <__kindof subclass*> *items = holderObject.items;
但是现在我收到此编译器警告:
Incompatible pointer types initializing 'NSMutableArray<subclass *> *' with an expression of type 'NSMutableArray<__kindof superclass *> * _Nullable'
这不是__kindof应该为我们做的吗?我在这里做错了什么?
更新2:这仅适用于可变数组。
更新:这是一些显示警告的简单代码:
创建一个新的类GenericsError.h:
@import UIKit;
@interface GenericsError : NSObject
@property (nonatomic) NSMutableArray <__kindof UIViewController*> *generics;
@end
在任何viewController中,只需添加:
GenericsError *error = [GenericsError new];
NSMutableArray <ViewController*>* controllers = error.generics;
(用ViewController替代您调用的viewController)。我没有添加或创建任何东西,只是得到了针对类属错误的编译器警告。
的通用参数NSMutableArray
是不变的(它是声明的@interface NSMutableArray<ObjectType>
,不是@interface NSMutableArray<__covariant ObjectType>
或@interface NSMutableArray<__contravariant ObjectType>
)。这意味着类型参数必须完全匹配才能兼容。
这意味着NSMutableArray<NSString *> *
不能被分配到NSMutableArray<NSObject *> *
,或反之,即使NSString *
可以被分配到NSObject *
。(另一方面,的类型参数NSArray
是协变的(已声明NSArray<__covariant ObjectType>
),这意味着NSArray<NSString *> *
可以分配给NSArray<NSObject *> *
。)
NSMutableArray<NSString *> *
即使可以双向分配和分配,也不能分配给,NSMutableArray<id> *
反之亦然。我想这个想法是关闭静态类型检查,但仅在使用实际类型时才使用,而不是在具有类型参数的类型上使用。NSString *
id
id
NSString *
id
id
id
__kindof superclass *
是的“受限”版本,id
它会关闭静态类型检查,但仅当分配给或从子类型分配时才关闭superclass *
。出于同样的原因,NSMutableArray<id> *
不能将其分配给或从NSMutableArray<someclass *> *
上NSMutableArray<__kindof superclass *> *
分配NSMutableArray<subclass *> *
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句