iOS 9新特性、泛型铅搓、__kindof的使用

iOS 9新特性關(guān)鍵字:nonnull瑟押、nullable、null_resettable

注意這幾個關(guān)鍵字都是用來修飾對象類型的星掰!

一多望、nonnull

1、作用:表示不能為空
2氢烘、舉例說明:
  • 屬性
    nonnull 聲明的屬性不能為空(getter方法和setter方法都有)

    //寫法一
    @property (nonnull, nonatomic, copy) NSString *name;
    //寫法二怀偷,小寫時為兩個下劃線
    @property (nonatomic, copy) NSString *__nonnull name;
    //寫法三,大寫時為一個下劃線
    @property (nonatomic, strong) NSString *_Nonnull name;
    

    這里需要注意一個問題:

    //系統(tǒng)會有警告不能給這個屬性賦nil
    person.name = nil;
    //下面這里系統(tǒng)不會識別到
    NSString *string = nil;
    [person setName:string];
    

    如下圖所示

1.png
  • 每個屬性都要寫關(guān)鍵字很麻煩播玖,用下面的方法

    NS_ASSUME_NONNULL_BEGIN
    @interface ViewController : UIViewController
    @property (nonatomic, weak) UILabel *label;
    @property (nonatomic, weak) UIButton * __nullable button;
    @property (null_resettable, nonatomic, strong) NSArray *friends;
    @end
    NS_ASSUME_NONNULL_END
    
    在 NS_ASSUME_NONNULL_BEGIN 和 NS_ASSUME_NONNULL_END 之間,
    定義的所有對象屬性和方法默認都是 nonnull
    NS_ASSUME_NONNULL_BEGIN
    NS_ASSUME_NONNULL_END 要成對出現(xiàn)椎工,不然報錯
    一般用于頭文件.h 將聲明包含起來針對所有屬性添加 nonnull 修飾
    也就是說, 除了 nullable 和 null_resetable 需要加修飾, 其他都不需要加修飾
    看下面對比圖:
    
2.png

屏幕快照 2016-07-23 20.35.42.png
  • 系統(tǒng)的代碼提示
    系統(tǒng)提示該方法的參數(shù)不能為空

    [array addObject:(nonnull NSString *)];
    

iOS 9以后系統(tǒng)都添加了這些關(guān)鍵字,方便開發(fā)者使用,我們也應(yīng)該給自己的工程添加這些關(guān)鍵字维蒙,這樣可以很明確的告訴其他人接口中的參數(shù)是否可以為空

二掰吕、nullable

1、作用:表示可以為空
2颅痊、舉例說明:
  • 屬性

    nullable 聲明的屬性可以為空
    //寫法一
    @property (nullable, nonatomic, copy) NSString *gender;
    //寫法二殖熟,小寫時為兩個下劃線
    @property (nonatomic, copy) NSString * __nullable gender;
    //寫法三,大寫時為一個下劃線
    @property (nonatomic, strong) NSString * _Nullable gender;
    
  • 系統(tǒng)代碼提示

    [person setGender:(NSString * _Nullable)];  
    下方是系統(tǒng)頭文件中的方法斑响,參數(shù)的關(guān)鍵字為nullable
    - (NSString *)uppercaseStringWithLocale:(nullable NSLocale *)locale
    

三菱属、null_resettable

1、作用:setter可為空, gette不可為空
  setter方法是nullable(可以賦空值)恋捆,getter方法是nonnull(取值不能為空)
2照皆、舉例說明:
  • 屬性

    //view是UIViewController頭文件中的屬性
    @property(null_resettable, nonatomic,strong) UIView *view;
    //tintColor是UIView頭文件中的屬性
    @property(null_resettable, nonatomic, strong) UIColor *tintColor
    
  • 當看到由null_resettable修飾的屬性時重绷,就應(yīng)該猜想這個屬性的初始化采用了懶加載方式

@property (nonatomic, strong, null_resettable) UITableView *tableView;

四沸停、泛型

1、帶泛型的容器(規(guī)定容器中所存儲的數(shù)據(jù)類型)

(1)帶泛型的數(shù)組

聲明一個可變數(shù)組, 內(nèi)部存放的都是NSString
1.數(shù)組中添加其他類型會有警告
2.數(shù)組取出來的類型不再是id類型, 會對應(yīng)變成聲明時的類型
3.泛型會改變類的一些方法, 使與聲明的類型相同
看下圖的情況:
屏幕快照 2016-07-23 21.05.14.png
在初始化的時候可以在數(shù)組中存儲不同類型的數(shù)據(jù)
完成初始化后就只能添加聲明類型的數(shù)據(jù)
取出來的類型再也不會是id類型啦昭卓,如下所示愤钾,firsObject屬性有固定的類型(自己聲明的類型)
屏幕快照 2016-07-23 21.09.38.png
聲明了容器中存儲的數(shù)據(jù)類型后系統(tǒng)的方法會有相應(yīng)的提示,從
下圖可以看到可變數(shù)組addObject:方法的參數(shù)有了規(guī)定的類型
屏幕快照 2016-07-23 21.13.43.png

(2)帶泛型的字典

屏幕快照 2016-07-24 08.40.35.png
可以看到使用泛型規(guī)定了字典key和value的數(shù)據(jù)類型后候醒,向字典中添加其他類型(如圖中的數(shù)組)
時會有類型不匹配的警告能颁。而從字典中取出的value也有了固定的類型(圖中規(guī)定的是NSString),
因此可以通過取出來的value使用getter方法得到字符串的length屬性

(3)自定義泛型

首先我們來看下什么是自定義泛型倒淫,下圖是系統(tǒng)NSMutableArray頭文件中的聲明伙菊,可以看到
在類名后面添加一對< >符號,中間是自定義泛型的名字(可以自己起名)敌土,后邊以 :父類名結(jié)束
聲明好自定義泛型之后镜硕,頭文件中方法的參數(shù)類型就可以使用自定義泛型來修飾了,如下圖所示
屏幕快照 2016-07-24 08.47.34.png
這里自定義泛型只能在聲明部分寫返干,在.m實現(xiàn)文件中則需使用id類型來表示自己定義的泛型兴枯,請看下圖
在自定義的Truck類.m文件中使用id來表示Truck類.h文件中的自定義泛型
屏幕快照 2016-07-24 08.53.24.png

五、協(xié)變性與逆變性

還是先來看看實際的例子來了解下什么是協(xié)變性和逆變性吧矩欠,
下圖是系統(tǒng) NSArray 的頭文件部分财剖,可以看到它使用了自定義泛型并命名為 OBjectType,
在自定義泛型前加了一個 __covariant 的修飾符癌淮,這個修飾符就表示協(xié)變性
屏幕快照 2016-07-24 09.02.33.png
__covariant - 協(xié)變性躺坟,子類型可以強轉(zhuǎn)到父類型(里氏替換原則)
__contravariant - 逆變性,父類型可以強轉(zhuǎn)到子類型

六乳蓄、__kindof

  • 一般用在方法的返回值

自定義類Truck的聲明部分

屏幕快照 2016-07-24 09.22.32.png

自定義類Truck的實現(xiàn)部分
屏幕快照 2016-07-24 09.11.32.png

分析上圖:加__kindof修飾后瞳氓,該方法的返回值原本是NSArray,
但是方法里邊卻返回了一個NSArray的子類NSMutableArray,
也就是說匣摘,加__kindof修飾后店诗,本類及其子類都可返回,
調(diào)用時可以使用本類或者本類的子類去接收方法的返回值音榜,請看下圖的方法調(diào)用:
屏幕快照 2016-07-24 09.20.01.png
如上圖所示使用自定義的Truck類調(diào)用方法庞瘸,
使用NSArray和NSMutableArray來接收返回值都是正確的
  • 系統(tǒng)中的使用請看下圖:
系統(tǒng)的UITableViewCell的中有這樣的寫法
屏幕快照 2016-07-25 14.59.13.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市赠叼,隨后出現(xiàn)的幾起案子擦囊,更是在濱河造成了極大的恐慌,老刑警劉巖嘴办,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瞬场,死亡現(xiàn)場離奇詭異,居然都是意外死亡涧郊,警方通過查閱死者的電腦和手機贯被,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來妆艘,“玉大人彤灶,你說我怎么就攤上這事∨” “怎么了幌陕?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長汽煮。 經(jīng)常有香客問我搏熄,道長,這世上最難降的妖魔是什么暇赤? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任心例,我火速辦了婚禮,結(jié)果婚禮上翎卓,老公的妹妹穿的比我還像新娘契邀。我一直安慰自己,他們只是感情好失暴,可當我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布坯门。 她就那樣靜靜地躺著,像睡著了一般逗扒。 火紅的嫁衣襯著肌膚如雪古戴。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天矩肩,我揣著相機與錄音现恼,去河邊找鬼。 笑死,一個胖子當著我的面吹牛叉袍,可吹牛的內(nèi)容都是我干的始锚。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼喳逛,長吁一口氣:“原來是場噩夢啊……” “哼瞧捌!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起润文,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤姐呐,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后典蝌,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體曙砂,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年骏掀,在試婚紗的時候發(fā)現(xiàn)自己被綠了鸠澈。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡砖织,死狀恐怖款侵,靈堂內(nèi)的尸體忽然破棺而出末荐,到底是詐尸還是另有隱情侧纯,我是刑警寧澤,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布甲脏,位于F島的核電站眶熬,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏块请。R本人自食惡果不足惜娜氏,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望墩新。 院中可真熱鬧贸弥,春花似錦垫毙、人聲如沸缚俏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽臣疑。三九已至盔憨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間讯沈,已是汗流浹背郁岩。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人问慎。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓萍摊,卻偏偏與公主長得像,于是被迫代替她去往敵國和親如叼。 傳聞我的和親對象是個殘疾皇子记餐,可洞房花燭夜當晚...
    茶點故事閱讀 45,077評論 2 355

推薦閱讀更多精彩內(nèi)容