ObjectType是Objective-C中的泛型
ObjectType的使用
- 自定義泛型只能在 @interface 上定義(類(lèi)聲明窗宇、類(lèi)擴(kuò)展、Category),這個(gè)類(lèi)型在 @interface 和 @end 區(qū)間的作用域有效特纤【。可以認(rèn)為是一個(gè)模板。模板名稱可以自己定義捧存。如下:
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
默認(rèn)情況下粪躬,系統(tǒng)會(huì)把ObjectType當(dāng)做id類(lèi)型來(lái)處理。當(dāng)然我們也可給泛型限制類(lèi)型昔穴。
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
泛型使用場(chǎng)景:
1.在集合(數(shù)組,字典,NSSet)中使用泛型比較常見(jiàn).
2.當(dāng)聲明一個(gè)類(lèi),類(lèi)里面的某些屬性的類(lèi)型不確定,這時(shí)候我們才使用泛型.
泛型書(shū)寫(xiě)規(guī)范
在類(lèi)型后面定義泛型,NSMutableArray<UITouch *> *datas
泛型好處:
1.提高開(kāi)發(fā)規(guī)范,減少程序員之間交流
2.通過(guò)集合取出來(lái)對(duì)象,直接當(dāng)做泛型對(duì)象使用,可以直接使用點(diǎn)語(yǔ)法
__covariant 和 __contravariant
- __covariant - 協(xié)變性镰官,子類(lèi)型可以強(qiáng)轉(zhuǎn)到父類(lèi)型。 如果有兩個(gè)數(shù)據(jù) UserModel<NSArray > a 和 UserModel<NSMutableArray> b,那么b復(fù)制給a是不會(huì)有警告的吗货,但是a賦值給b的話就會(huì)出現(xiàn)警告泳唠。
- __contravariant - 逆變性,父類(lèi)型可以強(qiáng)轉(zhuǎn)到子類(lèi)型宙搬。同理笨腥,a 賦值給b是不會(huì)有警告的。
__kindof 表示是否是該類(lèi)型的數(shù)據(jù)
@property (nonatomic, readonly, copy) NSArray<__kindof UIView *> *subviews;
UIButton *button = view.subviews.lastObject;
有了__kindof button 賦值就不會(huì)有警告了害淤。
https://shenfh.github.io/2016/12/14/ObjectType/
@interface NSMutableArray<ObjectType> : NSArray<ObjectType>