精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

亚洲av无码国产精品永久一区| 免费在线观看日韩| 亚洲电影二区| 亚洲午夜免费电影| 婷婷四房综合激情五月| 国产高清视频免费| 老妇喷水一区二区三区| 久久夜色撩人精品| 亚洲最大成人网站| 亚洲精品国产九九九| 欧美中文字幕不卡| 亚洲熟妇无码一区二区三区| 成人在线观看网站| av激情综合网| 成人午夜在线影院| 欧美一区二区三区网站| 欧美三级在线| 色黄久久久久久| 真人bbbbbbbbb毛片| 高清在线一区二区| 欧美撒尿777hd撒尿| 欧美日韩一道本| 亚洲丝袜精品| 18涩涩午夜精品.www| 免费国产一区二区| 刘亦菲毛片一区二区三区| 久久国产精品色婷婷| 4444欧美成人kkkk| 国产亚洲精品久久777777| 999久久久91| 亚洲社区在线观看| 黄色性生活一级片| 粉嫩一区二区三区四区公司1| 欧美日韩国产首页| 不卡av免费在线| 中文字幕在线看片| 午夜亚洲国产au精品一区二区| 四虎免费在线观看视频| 1区2区3区在线观看| 国产婷婷色一区二区三区四区| 国产精品三区在线| 亚洲黄色一级大片| 成人三级伦理片| 99www免费人成精品| 精品国产av一区二区三区| 久久se这里有精品| 成人黄色在线免费| 国产乱色精品成人免费视频 | 久久九九精品99国产精品| 成人午夜福利一区二区| 啄木系列成人av电影| 亚洲精品456在线播放狼人| 99精品一区二区三区无码吞精| 亚洲视频精选| 精品欧美乱码久久久久久1区2区 | 日韩免费精品| 日韩一区二区三区av| 国产999免费视频| 日韩免费成人| 亚洲国产精品久久久久| 99re久久精品国产| 久久不见久久见国语| 亚洲人成绝费网站色www| 成人无码av片在线观看| 99久久影视| 欧美日韩成人在线视频| 亚洲国产精品成人无久久精品| 激情欧美一区二区三区| 91地址最新发布| 色老头一区二区| 激情成人综合网| 91视频99| 水中色av综合| 国产精品污污网站在线观看| 丰满女人性猛交| 白浆视频在线观看| 欧美熟乱第一页| 天天操夜夜操很很操| 白嫩白嫩国产精品| 亚洲天堂av在线播放| 日韩精品一区二区三区在线视频| 欧美日韩综合| 国产成人精品999| 91av久久久| 成人av高清在线| 少妇免费毛片久久久久久久久| 国产精品扒开做爽爽爽的视频| 亚洲午夜羞羞片| 91蝌蚪视频在线观看| 国产一区二区三区| 日韩精品中文字幕视频在线| 国产第一页精品| 亚洲欧洲综合| 国产精品自拍网| 秋霞网一区二区| 国产精品视频一二三| 高清无码一区二区在线观看吞精| 三级成人在线| 精品免费日韩av| 五月激情四射婷婷| 亚洲日本成人| 91大片在线观看| 国产三级在线免费观看| 一区二区三区在线免费视频| 国产一区亚洲二区三区| 日本精品国产| 最新国产成人av网站网址麻豆| 日本五十路女优| 国内精品视频一区二区三区八戒| 欧美另类一区| 欧美一卡二卡| 在线不卡一区二区| 国产亚洲精品熟女国产成人| 影院欧美亚洲| 91免费看片网站| fc2在线中文字幕| 精品美女久久久久久免费| 亚洲热在线视频| 91麻豆国产自产在线观看亚洲| 国产69精品久久久久久| 午夜精品久久久久久久96蜜桃| 国产精品卡一卡二卡三| 成年人黄色片视频| 日韩精品a在线观看91| 欧美高跟鞋交xxxxhd| 91国内精品视频| 亚洲国产精品二十页| 99re在线视频免费观看| 青青视频一区二区| 亚州av一区二区| 亚洲精品视频网| 亚洲激情欧美激情| 99热这里只有精品2| 婷婷综合网站| 成人黄色免费片| 色影视在线观看| 欧美日韩一区二区三区在线 | 欧美中文字幕精品| 性xxxx视频播放免费| 亚洲第一福利视频在线| 超碰人人cao| 欧美午夜在线视频| 丁香五月网久久综合| 中文字幕资源网在线观看| 欧美精品 国产精品| 国产小视频你懂的| 久久成人免费电影| 中文字幕欧美日韩一区二区| 国产黄色一区| yellow中文字幕久久| 国产精品欧美激情在线| 成人超碰在线| av电影在线观看一区| 人妻无码久久一区二区三区免费| 国产精品黄网站| 78色国产精品| 黄色小视频在线观看| 欧美亚洲日本一区| 婷婷国产成人精品视频| 国产在线国偷精品产拍免费yy| 玖玖精品在线视频| 国产精品三p一区二区| 4438全国成人免费| av国产在线观看| 5858s免费视频成人| 欧美日韩一级大片| 99综合电影在线视频| www黄色av| 天天综合网网欲色| 国产精品日韩欧美一区二区| 在线天堂新版最新版在线8| 亚洲视频一区二区| 国产绿帽刺激高潮对白| 亚洲动漫第一页| 亚洲黄色小说视频| 精品一区二区国语对白| 欧美黑人在线观看| 国模精品一区| 91久久偷偷做嫩草影院| 都市激情亚洲综合| 久久国产精品亚洲| 日本福利片高清在线观看| 欧美日韩电影一区| 日本视频免费在线| 中文字幕在线一区二区三区| 91精品啪在线观看国产| 日韩不卡手机在线v区| 992tv快乐视频| 欧美人与物videos另类xxxxx| 91色在线视频| 欧美大片免费| 色中色综合影院手机版在线观看| 美州a亚洲一视本频v色道| 欧美一区二区三区电影| 在线观看免费国产视频| 亚洲人精品午夜| 精品少妇人妻一区二区黑料社区| 国产自产视频一区二区三区| 黄色免费视频大全| 午夜国产一区| 亚洲人成网站在线观看播放| 久久亚州av| 91欧美视频网站| 日韩成人亚洲| 91成品人片a无限观看| 国产福利在线播放麻豆| 亚洲欧美国内爽妇网| 亚洲a视频在线| 欧美浪妇xxxx高跟鞋交| 区一区二在线观看| 亚洲不卡一区二区三区| 极品魔鬼身材女神啪啪精品| 国产亚洲欧美日韩日本| 超碰男人的天堂| 国产99久久久国产精品| av免费一区二区| 久色成人在线| 国产精品免费入口| 伊人成年综合电影网| 男女激烈动态图| 日韩成人精品一区| 日韩免费av电影| 自拍欧美一区| 欧美精品七区| 女同另类激情重口| 国产激情一区二区三区在线观看| 亚洲人成777| 国产裸体写真av一区二区| 国产超碰精品| 国产成人免费91av在线| 欧美大片免费观看网址| 欧洲美女免费图片一区| 美女扒开腿让男人桶爽久久软| 久久男人资源视频| 91桃色在线| 久久久中精品2020中文| 高h视频在线播放| 欧美国产乱视频| heyzo在线播放| 97久久精品人人澡人人爽缅北| 最新国产在线拍揄自揄视频| 欧美成人精品一区二区三区| av网站在线看| 国内精品久久久久| 午夜久久中文| 日韩男女性生活视频| 欧美韩国亚洲| 国产精品爽爽爽| www久久久| 亚洲综合中文字幕在线| 99re只有精品| 狂野欧美xxxx韩国少妇| 日本高清视频一区| 国产成人精品123区免费视频| 国产99久久久欧美黑人| www.26天天久久天堂| 成人免费淫片视频软件| 亚洲精品午夜| 九九热久久66| 日韩精品免费一区二区在线观看| 正在播放国产精品| 欧美成人嫩草网站| 国产人妻777人伦精品hd| 香蕉久久夜色精品| 污版视频在线观看| 国产精品一区二区在线观看不卡| 中文字幕99页| 91麻豆精东视频| 色偷偷男人天堂| 一区二区三区在线播放| 日本a在线观看| 日本韩国欧美一区| 999av视频| 精品网站999www| 黄色国产网站在线播放| 97视频免费在线观看| 国产精品天堂蜜av在线播放| 成人动漫在线观看视频| 深爱激情综合| 国产 国语对白 露脸| 国产一区二区三区久久| 亚洲娇小娇小娇小| www.色精品| 国产精品综合激情| 亚洲成a人v欧美综合天堂下载 | 国产欧美一级| 奇米影视四色在线| 91在线高清观看| 91高清免费看| 色婷婷一区二区| 丰满熟女一区二区三区| 中文字幕亚洲一区在线观看| xxxx在线视频| 91免费欧美精品| 国产亚洲电影| 少妇av一区二区三区无码| 蜜桃视频第一区免费观看| 午夜不卡久久精品无码免费| 国产精品婷婷午夜在线观看| 日产精品久久久久久久| 6080午夜不卡| 川上优的av在线一区二区| 欧美精品激情视频| 91成人短视频在线观看| 欧美日韩精品免费观看| 国内精品久久久久久久影视麻豆| 在线观看国产一级片| 久久综合丝袜日本网| 免费一级片在线观看| 欧美欧美午夜aⅴ在线观看| 国产又爽又黄网站亚洲视频123| 免费av在线一区| 欧美黄页免费| 欧日韩一区二区三区| 国产欧美丝祙| v天堂中文在线| 亚洲图片欧美色图| 99久久久国产精品无码网爆| 在线看日韩av| 日韩色淫视频| 日韩精品成人一区二区在线观看| 亚洲精品视频啊美女在线直播| 国内av免费观看| 亚洲欧洲日韩在线| 最近中文字幕av| 一区二区成人精品| 奇米777日韩| 另类小说综合网| 亚洲一区国产| 五月婷婷综合在线观看| 婷婷成人激情在线网| 高潮一区二区三区乱码| 欧美日韩成人免费| 99精品中文字幕在线不卡| 亚洲天堂第一区| 国产精品99久| 九九在线观看视频| 欧美va亚洲va香蕉在线| 先锋成人av| 国产精品播放| 在线综合欧美| 亚洲av无码国产精品久久| 日韩欧美在线视频日韩欧美在线视频| 四虎影视在线观看2413| 日本精品一区二区三区在线播放视频| 亚洲精品推荐| 青青草av网站| 国产精品福利一区| 国产又黄又粗又猛又爽| 两个人的视频www国产精品| 精品国产乱码一区二区三区| 老司机激情视频| 99国产精品国产精品久久| 好看的av在线| 一区二区三区四区精品| 99综合99| av在线com| 久久人人超碰精品| 精品国产青草久久久久96| 丝袜一区二区三区| 日韩在线亚洲| 九色在线视频观看| 国产欧美精品一区二区色综合| 136福利视频导航| 久久久久久久久久av| 美女少妇全过程你懂的久久| 国产又大又黄又粗又爽| 亚洲美女少妇撒尿| 青青青免费视频在线2| 国产精品久久一区主播| 中文一区一区三区免费在线观看| 99热超碰在线| 欧洲激情一区二区| 羞羞视频在线免费国产| 久久综合九色综合网站| 免费观看日韩电影| 亚洲精品在线观看av| 国产午夜精品视频免费不卡69堂| 欧美黄色a视频| 欧美 日韩 亚洲 一区| 欧美高清一级片在线观看| 国内精品偷拍视频| 国产成人精品一区| 精品1区2区3区4区| 精品少妇一区二区三区密爱| 亚洲成人久久一区| 欧美系列精品| 免费无码不卡视频在线观看| 国产精品全国免费观看高清 | 99ri日韩精品视频| 亚洲黄色a v| 亚洲成在人线在线播放| av电影在线播放高清免费观看| 成人在线免费观看一区| 另类调教123区| 国产无套丰满白嫩对白| 欧美大尺度激情区在线播放| 精品国产中文字幕第一页| 一级全黄裸体片| 欧美色精品在线视频|