美文网首页iOS技术
OC中的ObjectType是什么类型

OC中的ObjectType是什么类型

作者: Zip000 | 来源:发表于2020-11-03 19:56 被阅读0次

    ObjectType是Objective-C中的泛型

    ObjectType的使用

    1. 自定义泛型只能在 @interface 上定义(类声明、类扩展、Category),这个类型在 @interface 和 @end 区间的作用域有效。可以认为是一个模板。模板名称可以自己定义。如下:
    NS_ASSUME_NONNULL_BEGIN
    @interface UserModel<__covariant ObjectType> : NSObject
    
    @property(nonatomic,strong,nullable) ObjectType object;
    - (void)pushObject:(ObjectType)object;
    - (__kindof ObjectType)value;
    @end
    
    NS_ASSUME_NONNULL_END
    

    默认情况下,系统会把ObjectType当做id类型来处理。当然我们也可给泛型限制类型。

    NS_ASSUME_NONNULL_BEGIN
    @interface UserModel<__covariant ObjectType:NSNumber *> : NSObject
    
    @property(nonatomic,strong,nullable) ObjectType object;
    - (void)pushObject:(ObjectType)object;
    
    @end
    
    NS_ASSUME_NONNULL_END
    

    泛型使用场景:
    1.在集合(数组,字典,NSSet)中使用泛型比较常见.
    2.当声明一个类,类里面的某些属性的类型不确定,这时候我们才使用泛型.

    泛型书写规范
    在类型后面定义泛型,NSMutableArray<UITouch *> *datas

    泛型好处:
    1.提高开发规范,减少程序员之间交流
    2.通过集合取出来对象,直接当做泛型对象使用,可以直接使用点语法

    __covariant 和 __contravariant

    • __covariant - 协变性,子类型可以强转到父类型。 如果有两个数据 UserModel<NSArray > a 和 UserModel<NSMutableArray> b,那么b复制给a是不会有警告的,但是a赋值给b的话就会出现警告。
    • __contravariant - 逆变性,父类型可以强转到子类型。同理,a 赋值给b是不会有警告的。

    __kindof 表示是否是该类型的数据

    @property (nonatomic, readonly, copy) NSArray<__kindof UIView *> *subviews;
    
    UIButton *button = view.subviews.lastObject;
    

    有了__kindof button 赋值就不会有警告了。

    https://shenfh.github.io/2016/12/14/ObjectType/

    @interface NSMutableArray<ObjectType> : NSArray<ObjectType>

    相关文章

      网友评论

        本文标题:OC中的ObjectType是什么类型

        本文链接:https://www.haomeiwen.com/subject/vtvmvktx.html