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是任意类型都可以,nsstring,array等等,有的时候并不可以是所有类型都应该被允许的,比如我这里只希望是一个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 && [self.dela respondsToSelector:@selector(mylog)]) {
[self.dela mylog];
}
使用方法:在你需要签订协议的地方进行签订协议:
//.m文件下
@interface myScrollView()<FanXingViewPro>
然后实现对应的协议方法就可以了。另外,需要delegate给dala(上面提到的),不然不会执行协议。