OC中的一些修飾關(guān)鍵字

  • nullable: 表示對象可以為空
    下面是三種寫法:
@property (nullable, nonatomic, strong) NSString *name;
@property (nonatomic, strong) NSString * _Nullable name;
@property (nonatomic, strong) NSString * __nullable name;
  • nonnull: 表示對象不能為空
    下面是三種寫法:
@property (nonnull, nonatomic, strong) NSString *name;
@property (nonatomic, strong) NSString * _Nonnull name;
@property (nonatomic, strong) NSString * __nonnull name;
  • null_resettable: 當(dāng)用此關(guān)鍵字修飾對象屬性時(shí), 表示通過getter方法獲取的對象屬性不為空,通過setter方法進(jìn)行賦值時(shí)可以為空, 而且必須實(shí)現(xiàn)其getter或者setter方法, 不然會報(bào)警告.

  • 泛型

可以通過泛型的特性來限制數(shù)組中的元素只能為某一種類型, 例如有一個(gè)數(shù)組,我們想讓放入里面的元素都為NSString類型, 那么可以這么寫:

@property (nonatomic, strong) NSMutableArray<NSString *> * names;

我們也可以自定義泛型:
下面我們新建一個(gè)Animal類, 并給Animal類添加一個(gè)表示物種的屬性species, 這個(gè)屬性的類型時(shí)是不確定的.
Animal.h中代碼如下:

#import <Foundation/Foundation.h>

@interface Animal<ObjectType> : NSObject
@property (nonatomic, strong) ObjectType species;
@end

接著在ViewController.m進(jìn)行測試,在初始化時(shí)如果指定了ObjectType為某一類型后, 在對屬性species進(jìn)行賦值時(shí), xcode會進(jìn)行提示species所需的類型,如下圖:

自定義泛型
  • __covariant: 協(xié)變, 子類可以強(qiáng)轉(zhuǎn)為父類(里氏替換原則).
    __contravariant: 逆變, 父類可以強(qiáng)轉(zhuǎn)為子類.
    新建兩個(gè)Animal對象ab,分別制定屬性的類型為NSStringNSMutableString類型,通過ab進(jìn)行強(qiáng)轉(zhuǎn)時(shí)會出現(xiàn)如下警告:
強(qiáng)轉(zhuǎn)時(shí)報(bào)錯(cuò)

如果想要a = b不報(bào)警,也就是允許子類強(qiáng)轉(zhuǎn)為父類,則需要在Animal.h加入__covariant關(guān)鍵字, 代碼如下:

#import <Foundation/Foundation.h>

@interface Animal<__covariant ObjectType> : NSObject
@property (nonatomic, strong) ObjectType species;
@end

如果想要b = a不報(bào)警,也就是允許父類強(qiáng)轉(zhuǎn)為子類,則需要在Animal.h加入__contravariant關(guān)鍵字, 代碼如下:

#import <Foundation/Foundation.h>

@interface Animal<__contravariant ObjectType> : NSObject
@property (nonatomic, strong) ObjectType species;
@end
  • __kindof: 表示當(dāng)前類或者其子類.

例如在UITableView類中有如下方法:

- (nullable __kindof UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath; 

這里的__kindof表示的含義就是該方法返回的是UITableViewCell對象,或者是UITableViewCell的子類對象.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 第一個(gè)饅頭】 A.一位餓得奄奄一息的人,跌跌撞撞地跑到一位農(nóng)夫家。農(nóng)夫給他一個(gè)饅頭、一碗水,饑餓者得救了。得救者走...
    重回漢唐閱讀 388評論 0 0
  • “好不容易在家待一天,結(jié)果停水又停電的”珊珊媽媽這么感慨。 “姐,我出去上個(gè)廁所?!?“哎,弟,你就在家里上吧,從...
    林溪邊閱讀 163評論 0 0
  • 在你讀這份資料前,我要先跟你說一句悄悄話,因?yàn)檫@句話會改變你以往的思維,讓你受益終生—你不需要有好的文筆,也不需要...
    小喬流水人家去閱讀 1,210評論 0 0
  • Math對象是JavaScript的內(nèi)置對象,提供一系列數(shù)學(xué)常數(shù)和數(shù)學(xué)方法。Math對象只提供了靜態(tài)的屬性和方法,...
    王康_Wang閱讀 458評論 0 0

友情鏈接更多精彩內(nèi)容