精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

全世界都在說Swift開源的時候—2015 Objective-C 新特性

移動開發 iOS 開發工具
自 WWDC 2015 推出和開源 Swift 2.0 后,大家對 Swift 的熱情又一次高漲起來,在羨慕創業公司的朋友們大談 Swift 新特性的同時,也有很多像我一樣工作上依然需要堅守著 Objective-C 語言的開發者們。

Overview

自 WWDC 2015 推出和開源 Swift 2.0 后,大家對 Swift 的熱情又一次高漲起來,在羨慕創業公司的朋友們大談 Swift 新特性的同時,也有很多像我一樣工作上依然需要堅守著 Objective-C 語言的開發者們。今年的 WWDC 中介紹了幾個 Objective-C 語言的新特性,還是在“與 Swift 協同工作”這種 Topic 里講的,越發凸顯這門語言的邊緣化了,不過有新特性還是極好的,接下來,本文將介紹下面三個主要的新特性:

Nullability

Lightweight Generics *

__kindof

Nullability

然而 Nullability 并不算新特性了,從上一個版本的 llvm 6.1 (Xcode 6.3) 就已經支持。這個簡版的 Optional ,沒有 Swift 中 ? 和 ! 語法糖的支持,在 Objective-C 中就顯得非常啰嗦了:

  1. @property (nonatomic, strong, nonnull) Sark *sark; 
  2. @property (nonatomic, copy, readonly, nullable) NSArray *friends; 
  3. + (nullable NSString *)friendWithName:(nonnull NSString *)name; 

假如用來修飾一個變量,前面還要加雙下劃線,放到 block 里面就更加詭異,比如一個 Request 的 start 方法可以寫成:

  1. - (void)startWithCompletionBlock:(nullable void (^)(NSError * __nullable error))block; 

除了這倆外,還有個 null_resettable 來表示 setter nullable,但是 getter nonnull,繞死了,最直觀例子就是 UIViewController 中的 view 屬性:

  1. @property (null_resettable, nonatomic, strong) UIView *view; 

它可以被設成 nil,但是調用 getter 時會觸發 -loadView 從而創建并返回一個非 nil 的 view。

從 iOS9 SDK 中可以發現,頭文件中所有 API 都已經增加了 Nullability 相關修飾符,想了解這個特性的用法,翻幾個系統頭文件就差不離了。接口中 nullable 的是少數,所以為了防止寫一大堆 nonnull,Foundation 還提供了一對兒宏,包在里面的對象默認加 nonnull 修飾符,只需要把 nullable 的指出來就行,黑話叫 Audited Regions:

  1. NS_ASSUME_NONNULL_BEGIN 
  2. @interface Sark : NSObject 
  3. @property (nonatomic, copy, nullable) NSString *workingCompany; 
  4. @property (nonatomic, copy) NSArray *friends; 
  5. - (nullable NSString *)gayFriend; 
  6. @end 
  7. NS_ASSUME_NONNULL_END 

Nullability 在編譯器層面提供了空值的類型檢查,在類型不符時給出 warning,方便開發者第一時間發現潛在問題。不過我想更大的意義在于能夠更加清楚的描述接口,是主調者和被調者間的一個協議,比多少句文檔描述都來得清晰,打個比方:

  1. + (nullable instancetype)URLWithString:(NSString *)URLString; 

NSURL 的這個 API 前面加了 nullable 后,更加顯式的指出了這個接口可能因為 URLString 的格式錯誤而創建失敗,使用時自然而然的就考慮到了判空處理。

不僅是屬性和方法中的對象,對于局部的對象、甚至 c 指針都可以用帶雙下劃線的修飾符,可以理解成能用 const 關鍵字的地方都能用 Nullability。

所以 Nullability 總的來說就是,寫著丑B,用著舒服 - -

Lightweight Generics

Lightweight Generics 輕量級泛型,輕量是因為這是個純編譯器的語法支持(llvm 7.0),和 Nullability 一樣,沒有借助任何 objc runtime 的升級,也就是說,這個新語法在 Xcode 7 上可以使用且完全向下兼容(更低的 iOS 版本)

帶泛型的容器

這無疑是本次最重大的改進,有了泛型后終于可以指定容器類中對象的類型了:

  1. NSArray<NSString *> *strings = @[@"sun", @"yuan"]; 
  2. NSDictionary<NSString *, NSNumber *> *mapping = @{@"a"@1, @"b"@2}; 

返回值的 id 被替換成具體的類型后,令人感動的代碼提示也出來了:

假如向泛型容器中加入錯誤的對象,編譯器會不開心的:

系統中常用的一系列容器類型都增加了泛型支持,甚至連 NSEnumerator 都支持了,這是非常 Nice 的改進。和 Nullability 一樣,我認為最大的意義還是豐富了接口描述信息,對比下面兩種寫法:

  1. @property (readonly) NSArray *imageURLs; 
  2. @property (readonly) NSArray<NSURL *> *imageURLs; 

不用多想就清楚下面的數組中存的是什么,避免了 NSString 和 NSURL 的混亂。

自定義泛型類

比起使用系統的泛型容器,更好玩的是自定義一個泛型類,目前這里還沒什么文檔,但攔不住我們寫測試代碼,假設我們要自定義一個 Stack 容器類:

  1. @interface Stack<ObjectType> : NSObject 
  2. - (void)pushObject:(ObjectType)object; 
  3. - (ObjectType)popObject; 
  4. @property (nonatomic, readonly) NSArray<ObjectType> *allObjects; 
  5. @end 

這個 ObjectType 是傳入類型的 placeholder,它只能在 @interface 上定義(類聲明、類擴展、Category),如果你喜歡用 T 表示也 ok,這個類型在 @interface 和 @end 區間的作用域有效,可以把它作為入參、出參、甚至內部 NSArray 屬性的泛型類型,應該說一切都是符合預期的。我們還可以給 ObjectType 增加類型限制,比如:

  1. // 只接受 NSNumber * 的泛型 
  2. @interface Stack<ObjectType: NSNumber *> : NSObject 
  3. // 只接受滿足 NSCopying 協議的泛型 
  4. @interface Stack<ObjectType: id<NSCopying>> : NSObject 

若什么都不加,表示接受任意類型 ( id );當類型不滿足時編譯器將產生 error。

實例化一個 Stack,一切工作正常:

對于多參數的泛型,用逗號隔開,其他都一樣,可以參考 NSDictionary 的頭文件。

協變性和逆變性

當類支持泛型后,它們的 Type 發生了變化,比如下面三個對象看上去都是 Stack,但實際上屬于三個 Type:

  1. Stack *stack; // Stack * 
  2. Stack<NSString *> *stringStack; // Stack<NSString *> 
  3. Stack<NSMutableString *> *mutableStringStack; // Stack<NSMutableString *> 

當其中兩種類型做類型轉化時,編譯器需要知道哪些轉化是允許的,哪些是禁止的,比如,默認情況下:

我們可以看到,不指定泛型類型的 Stack 可以和任意泛型類型轉化,但指定了泛型類型后,兩個不同類型間是不可以強轉的,假如你希望主動控制轉化關系,就需要使用泛型的協變性和逆變性修飾符了:

__covariant - 協變性,子類型可以強轉到父類型(里氏替換原則)

__contravariant - 逆變性,父類型可以強轉到子類型(WTF?)

協變:

  1. @interface Stack<__covariant ObjectType> : NSObject 

效果:

逆變:

  1. @interface Stack<__contravariant ObjectType> : NSObject 

效果:

協變是非常好理解的,像 NSArray 的泛型就用了協變的修飾符,而逆變我還沒有想到有什么實際的使用場景。

__kindof

__kindof 這修飾符還是很實用的,解決了一個長期以來的小痛點,拿原來的 UITableView 的這個方法來說:

  1. - (id)dequeueReusableCellWithIdentifier:(NSString *)identifier; 

使用時前面基本會使用 UITableViewCell 子類型的指針來接收返回值,所以這個 API 為了讓開發者不必每次都蛋疼的寫顯式強轉,把返回值定義成了 id 類型,而這個 API 實際上的意思是返回一個 UITableViewCell 或 UITableViewCell 子類的實例,于是新的 __kindof 關鍵字解決了這個問題:

  1. - (__kindof UITableViewCell *)dequeueReusableCellWithIdentifier:(NSString *)identifier; 

既明確表明了返回值,又讓使用者不必寫強轉。再舉個帶泛型的例子,UIView 的 subviews 屬性被修改成了:

  1. @property (nonatomic, readonly, copy) NSArray<__kindof UIView *> *subviews; 

這樣,寫下面的代碼時就沒有任何警告了:

  1. UIButton *button = view.subviews.lastObject; 

Where to go

有了上面介紹的這些新特性以及如 instancetype 這樣的歷史更新,Objective-C 這門古老語言的類型檢測和類型推斷終于有所長進,現在不論是接口還是代碼中的 id 類型都越來越少,更多潛在的類型錯誤可以被編譯器的靜態檢查發現。

同時,個人感覺新版的 Xcode 對繼承鏈構造器的檢測也加強了,NS_DESIGNATED_INITIALIZER 這個宏并不是新面孔,可以使用它標志出像 Swift 一樣的指定構造器和便捷構造器。

最后,附上一段用上了所有新特性的代碼,Swift 是發展趨勢,如果你暫時依然要寫 Objective-C 代碼,把所有新特性都用上,或許能讓你到新語言的遷移更無痛一點。

責任編輯:chenqingxiang 來源: sunnyxx
相關推薦

2015-11-02 10:13:41

iOSObjective-C語法

2014-11-25 10:18:17

Objective-C

2014-07-01 09:22:01

SwiftObjective-CiOS

2013-07-24 19:19:03

Objective-CiOS開發動態特性之protoc

2015-06-08 10:02:40

swiftOC兼容

2014-08-05 13:09:34

Objective-C動態特性

2014-09-26 09:49:48

SwiftObjective-C

2014-06-05 13:54:03

SwiftiOSObjective-C

2014-09-24 11:15:05

Objective-CSwift

2017-04-07 16:00:59

SwiftObjective-CFramework

2020-03-02 15:48:26

戴爾

2014-10-13 09:54:08

Objective-CSwift

2014-12-12 14:57:11

Objective-C封裝

2011-08-04 13:55:10

Cocoa Objective- 文件

2011-08-10 18:07:29

Objective-C反射

2015-07-08 10:47:57

Using Swift CocoaObjective-C

2011-05-11 11:20:26

Objective-C

2013-03-27 12:54:00

iOS開發Objective-C

2011-05-11 15:58:34

Objective-C

2013-06-20 10:40:32

Objective-C實現截圖
點贊
收藏

51CTO技術棧公眾號

91麻豆精品激情在线观看最新| 免费的黄网站在线观看| 国产精品久久777777毛茸茸| 亚洲欧美制服中文字幕| 中文av一区二区三区| 91国内在线| 91免费看片在线观看| 国产精品自拍小视频| 久久久久久久黄色| 国产精品亚洲片在线播放| 欧美精选午夜久久久乱码6080| 少妇高潮流白浆| 网站黄在线观看| 免费一级片91| 久久久久久中文| 国产精品久久免费观看| 白白在线精品| 色综合一个色综合亚洲| 妞干网这里只有精品| 免费在线国产| 成人av电影免费在线播放| 国产精品免费电影| 日韩 欧美 亚洲| 99久久激情| 亚洲欧洲视频在线| 国产无套精品一区二区三区| 澳门av一区二区三区| 亚洲午夜久久久| 亚洲一区二区三区乱码| 日本国产在线| 成人免费视频视频在线观看免费| 国产日韩欧美中文在线播放| 日操夜操天天操| 欧美日韩三级| 亚洲一级免费视频| 国产精品无码永久免费不卡| 最新国产精品精品视频| 欧美日韩国产一二三| chinese少妇国语对白| 国产三级电影在线播放| 亚洲一区二区三区四区五区黄 | 青青在线视频免费| segui88久久综合| 一区二区三区四区中文字幕| www.午夜色| 3p视频在线观看| 国产人久久人人人人爽| 久久久久久草| 涩涩视频在线观看免费| 97久久人人超碰| 国产日本一区二区三区| 成人小说亚洲一区二区三区 | 视频免费在线观看| 国产一国产二国产三| 爱爱免费小视频| 精品一区二区三区中文字幕视频| 欧美撒尿777hd撒尿| 成人在线激情网| 免费在线观看一区| 欧洲一区在线观看| 欧美精品成人网| 影音成人av| 欧美日韩在线电影| 中文av一区二区三区| 一区二区三区| 日韩欧美高清dvd碟片| 久久精品无码一区二区三区毛片| 成人豆花视频| 欧美不卡一区二区三区| 欧美做受高潮中文字幕| 欧美丝袜美腿| 国产小视频国产精品| 男人天堂资源网| 亚洲综合激情在线| 色综合91久久精品中文字幕| 精品无码一区二区三区电影桃花 | 91亚洲国产高清| 久久精品一本久久99精品| 无码人妻精品一区二区三区夜夜嗨 | 欧美mv日韩mv国产| 亚洲一区二区在线免费| 国产a久久精品一区二区三区| 亚洲码在线观看| 国产wwwwxxxx| 欧美精品成人| 亲子乱一区二区三区电影 | 在线视频cao| 欧美性猛交xxxxxx富婆| 中文字幕一区二区三区四| 亚洲亚洲一区二区三区| 亚洲人成在线播放| 乱h高h女3p含苞待放| 亚洲茄子视频| 国产精品对白刺激| 精品人妻aV中文字幕乱码色欲| 成人免费视频视频在线观看免费| 日本高清不卡一区二区三| 麻豆传媒视频在线| 午夜精品久久久| 婷婷免费在线观看| 精品国产影院| 日韩在线中文视频| 毛片在线免费视频| 精品亚洲国内自在自线福利| 国产综合av一区二区三区| 自拍视频在线网| 亚洲6080在线| 日本在线观看视频一区| 欧美理论电影在线精品| 日韩最新免费不卡| 9i看片成人免费看片| 国产一区二区三区免费看| 精品免费一区二区三区蜜桃| 麻豆视频网站在线观看| 狠狠躁夜夜躁人人躁婷婷91 | 亚洲欧美一二三区| 福利一区二区在线观看| 亚洲一二三区在线| 一二三四视频在线中文| 欧美肥胖老妇做爰| 成人性生交大片免费看无遮挡aⅴ| 红桃视频国产一区| 成人黄色午夜影院| wwwxxx在线观看| 午夜精品在线视频一区| 青青草精品在线| 99精品视频精品精品视频| 国产ts一区二区| 欧美一级特黄aaaaaa| 亚洲精选一二三| 亚洲欧美日本一区二区三区| 国产99精品一区| 高清亚洲成在人网站天堂| 国产精品一区二区三区在线免费观看| 国产亚洲污的网站| av免费观看网| 久久男人av| 韩国福利视频一区| 免费观看的毛片| 亚洲欧美日韩一区二区 | 中文字幕亚洲无线码a| 久久精品久久久久久久| 99久久精品免费观看| 东北少妇不带套对白| 97青娱国产盛宴精品视频| 免费av一区二区| 国产农村老头老太视频| 国产精品久线在线观看| 中文字幕av不卡在线| 激情婷婷综合| 国产精品久久久久久久久久久久| 精品三级久久久久久久电影聊斋| 日韩欧美综合在线视频| 欧美色图亚洲激情| 久久亚洲二区| 免费国产一区| 日本在线中文字幕一区二区三区| 亚洲欧洲高清在线| 亚洲第一区av| 国产精品超碰97尤物18| 亚洲色图偷拍视频| 中文乱码免费一区二区三区下载| 91天堂在线视频| 在线三级电影| 亚洲丁香久久久| 中文字幕69页| 中文字幕免费一区| 成人亚洲免费视频| 亚洲一区 二区 三区| 国产精品日韩一区二区| 深夜成人在线| 最新日韩中文字幕| www.久久综合| 欧美午夜电影在线| 日本欧美一区二区三区不卡视频| 久久国产人妖系列| 人妻互换免费中文字幕| 伊人久久大香线蕉av不卡| 国产精品国产三级国产aⅴ浪潮| 午夜视频在线| 亚洲成人aaa| 波多野结衣在线观看视频| 中文字幕制服丝袜成人av | 成人精品视频一区二区| 欧美hentaied在线观看| 丁香五月网久久综合| 在线观看涩涩| 久久精品精品电影网| 免费看黄网站在线观看| 欧美无乱码久久久免费午夜一区 | 人妻丰满熟妇aⅴ无码| 日本不卡视频一二三区| 成人在线免费高清视频| 亚洲精品国产setv| 91精品综合视频| 亚洲最新无码中文字幕久久| 日韩亚洲综合在线| 色婷婷av一区二区三区之红樱桃| 欧美午夜精品久久久久久孕妇| 久久久久久久久久久网| 欧美国产精品一区二区| 精品人妻一区二区三区日产| 麻豆久久久久久久| 国产伦精品一区二区三区四区视频_ | 亚洲人成在线观| 风流老熟女一区二区三区| 欧美亚洲一区二区三区四区| 日本熟女一区二区| 亚洲欧美日韩一区| 亚洲欧美va天堂人熟伦| 国产白丝精品91爽爽久久| 色免费在线视频| 老司机一区二区三区| 男人天堂av片| 欧美在线播放| 一区二区三区四区欧美| 国产成人短视频在线观看| 国产精品日韩一区二区三区| 国产视频网站一区二区三区| 国产精品免费网站| 亚洲天堂av影院| 久久人人爽人人爽人人片av高清| 成人在线app| 中文字幕免费精品一区高清| 牛牛澡牛牛爽一区二区| 亚洲精品www久久久| 精品人妻伦一二三区久久| 欧美日韩成人一区二区| 激情视频网站在线观看| 岛国av一区二区| 久久免费少妇高潮99精品| 国产精品久久久久久久岛一牛影视 | 影音先锋欧美在线| 国产精品片aa在线观看| 国产精品亚洲一区| 一区二区三区亚洲变态调教大结局| 国产精品免费福利| 成人爱爱网址| 色综合久综合久久综合久鬼88 | 91视视频在线观看入口直接观看www | 亚洲综合社区网| 国产精品va视频| 国产精品久久久久久av| 在线天堂中文资源最新版| 96精品视频在线| 国产丝袜精品丝袜| 麻豆国产va免费精品高清在线| 黄色片在线播放| 一区二区三区视频在线 | 亚洲国产欧美在线观看| 成人黄在线观看| 国外成人福利视频| 国产一区香蕉久久| 精品久久毛片| 国产精品免费在线免费| 澳门成人av网| 国产精品免费一区| 四虎在线精品| 国产欧美一区二区白浆黑人| www.久久草.com| 成人日韩av在线| 亚洲人成网站在线在线观看| 亚洲一区二区自拍| 国产精品色婷婷在线观看| 成人av电影免费| 日日狠狠久久偷偷综合色| 欧美一级二级三级九九九| 久久精品av| 免费在线看黄色片| 亚洲男女自偷自拍| 日本黄网站免费| 精品一区二区三区欧美| 亚洲综合123| 成人综合婷婷国产精品久久蜜臀| 自拍视频一区二区| 久久女同精品一区二区| 精品无码一区二区三区| 国产精品麻豆网站| 一级黄色片日本| 一区二区三区四区激情| 六月丁香激情综合| 欧美性极品少妇| 99久久免费国产精精品| 亚洲精品美女久久久| 国产污视频在线| 欧美日本啪啪无遮挡网站| 中国色在线日|韩| 国产精品久久国产精品99gif| 激情亚洲小说| 精品高清视频| 成人免费在线播放| 日韩 欧美 自拍| 亚洲一区二区伦理| 中文字幕 日韩 欧美| 国产精品99久久久久| japanese中文字幕| 亚洲欧美乱综合| 在线观看 亚洲| 欧美成人午夜电影| 久久久资源网| 欧美激情三级免费| 日韩av超清在线观看| 97神马电影| 欧美aaaa视频| 91国视频在线| 成人性视频免费网站| 黄免费在线观看| 亚洲男女毛片无遮挡| 手机av免费观看| 欧美精品一区二区高清在线观看| 五月婷婷丁香花| 色综合五月天导航| 成人国产精品| 国产精品免费观看高清| 亚洲天天综合| 超碰影院在线观看| 国内不卡的二区三区中文字幕| 免费看污黄网站在线观看| 亚洲免费在线视频一区 二区| 中日韩黄色大片| 日韩免费视频一区| 黄色免费在线看| 国产999精品久久久影片官网| ccyy激情综合| www.男人天堂网| 久久se这里有精品| www.自拍偷拍| 欧美日韩综合视频| 亚洲精品免费在线观看视频| 欧美www在线| 欧美黑粗硬大| 日韩欧美亚洲v片| 视频一区欧美日韩| 中文字幕一区二区人妻电影丶| 国产精品高潮久久久久无| 亚洲一二区视频| 亚洲视频777| 丝袜诱惑一区二区| 久久精品国产美女| 狠狠综合久久| 在线观看免费看片| 一区二区日韩av| 国产精品一区二区av白丝下载 | 日韩欧美一区二区三区| 丰满肉嫩西川结衣av| 国外成人在线视频| 亚洲超碰在线观看| 欧美日韩在线免费观看视频| 精品一区二区免费视频| 黄色国产在线播放| 91久久免费观看| 超碰在线影院| 国产精品亚洲网站| 日韩欧美三级| 亚洲第一区第二区第三区| 中文字幕不卡的av| 久久精品性爱视频| 日韩va亚洲va欧洲va国产| www.九色在线| 日韩免费av电影| 日韩精品电影在线| 性欧美一区二区| 欧美日韩国产成人在线91| 最新真实国产在线视频| 国产女同一区二区| 欧美~级网站不卡| 亚洲欧洲国产视频| 欧美日韩国产在线| 三区在线观看| 国产成人综合精品| 羞羞色午夜精品一区二区三区| 嫩草视频免费在线观看| 亚洲欧美偷拍三级| 亚洲欧美色视频| 国产精品成久久久久三级| 希岛爱理av一区二区三区| 波多野结衣在线免费观看| 夜夜操天天操亚洲| 免费在线观看污视频| 国产精品男人爽免费视频1| 精品视频免费| av在线免费观看不卡| 亚洲成a人片综合在线| 国内三级在线观看| 成人深夜直播免费观看| 好吊视频一区二区三区四区| japanese中文字幕| 7777精品伊人久久久大香线蕉完整版| av网址在线播放| 国模精品一区二区三区| 天堂va蜜桃一区二区三区漫画版| 成人性生活毛片| 亚洲成人av片| 三上悠亚国产精品一区二区三区| 91国在线高清视频| 99久久精品国产网站| 国产精品永久久久久久久久久| 久久久最新网址| 欧美日韩一二三四| 91视频在线免费|