本文介绍: OC下泛型定义应用以及协议定义和应用

1.对于NSSet,NSDictionary和NSArray而言,可以限定存储数据类型比如

NSMutableArray<UIView *>* arr = [NSMutableArray array];

这个arr存储UIview类型。但是如果存储了非限定的类型,并不会报错,只是会报警告。

好处是,当调用arr的某一个元素时候,不需要

UIView * view = arr[0];
view.frame = frame;

修改其中的参数,而是可以

arr[0].frame = frame;

就方便了很多。但是如果存储类型不是限定的类型比如此处arr[0]存储一个字符串,而字符串没有frame。此处就会报错

除此之外,限定的类型还可以是自己定义的类的类型。比如model

2.对于某一个类的泛型定义可以这样

@interface fanxing <objectTe>: NSObject

@property (nonatomic , strong)objectTe Lange;


@end

<>就是泛型名称类中如果有某一个属性类型不确定,需要调用该类的对象来给出,就可以使用这个泛型使用方法如下

fanxing<ios *> *fan = [[fanxing alloc]init];
fanxing<lange *> *fan2 = [[fanxing alloc]init];

此时对于fan这个对象而言,fan.lange的数据类型就是我自定义ios类型。fan2对象而言,fan2.lange的数据类型就是我自定义的lange类型。

当然,此时的objectTe是任意类型都可以,nsstringarray等等,有的时候并不可以是所有类型都应该被允许的,比如我这里只希望是一个view以及view子类类型,不可以是nsstring类型。

那么就可以加上类型限定,代码如下

@interface fanxing <objectTe:UIView * >: NSObject
@property (nonatomic , strong)objectTe Lange;
-(id)returnlange;
@end

此时的lange只可能是uiview以及uiview子类。注意的是,这里需要view指针,而不是uiview, “ * ”不可省略。

3.另外,网上资料说,__covariant协变__contravariant是逆变,协变是是子类可以赋值父类,即里氏替换原则。而逆变是父类可以赋值子类反向的里氏替换

//逆变
@interface fanxing <__contravariant objectTe:UIView * >: NSObject
@property (nonatomic , strong)objectTe Lange;

@end


//协变
@interface fanxing <__covariant objectTe:UIView * >: NSObject
@property (nonatomic , strong)objectTe Lange;

@end

但是我实际操作的时候,逆变和协变添加还是不添加代码结果都是一致的,无论是子类父类还是父类子类。而且添加了逆变,父类给子类仍然会给警告。目前我还不知道这玩意到底怎么用,而且__covariant会变色表明是关键字,但__contravariant并不会,仍然和属性是一个颜色,但不会报错。不清楚啥情况

协议定义

@protocol FanXingViewPro <NSObject>
@required
-(void)mylog;
@optional
-(void)mylog2;
@end

@interface FanXingView : UIView
@property (nonatomic, assign)id<FanXingViewPro> dela;

@end

@protocol  协议名 <涉及到的其他协议>

@required

必须实现方法,不实现报错

@optional

可选的方法

@end

注意,1.这里需要有一个属性用来接收delegate的,不然无法回调到签协议的那个类中方法

        2.还需要再协议声明类中判断delegate是否是空的和方法没有实现,以免找不到方法导致的崩溃代码如下

if (self.dela != nil &amp;&amp; [self.dela respondsToSelector:@selector(mylog)]) {
  [self.dela mylog];
}

使用方法:在你需要签订协议的地方进行签订协议:

//.m文件下
@interface myScrollView()<FanXingViewPro>

然后实现对应的协议方法就可以了。另外,需要delegate给dala(上面提到的),不然不会执行协议。

原文地址:https://blog.csdn.net/qq_36924305/article/details/125854601

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_17829.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注