Objective-C 與 Swift 的那檔事(原文)
前言
自從蘋果 WWDC 2014 大會上,我們的銀髮帥哥 Craig Federighi 宣布全新程式語言 Swift 之後,iOS 程式開發就進入了全新的領域(和噩夢XD)。
Dcard 在去年 Swift 2.0 發布之後便開始使用 Swift 開發,過程中發現了很多令人興奮的新特性、新寫法、和新的地雷(笑),未來我們會將一些使用 Swift 開發的心路歷程分享給各位。
今天我們將專注在 NS_STRING_ENUM 這個神奇的語法上,但在這之前我們先來談談 Objective-C 的字串常數。
Objective-C 字串常數
過去我們在使用 Objective-C 時,經常會宣告很多 NSString 的常數來當作 NSDictionary 的 key。例如:
// Dicitonary keys
NSString * const DCDictionaryKeyTitle = @"title";
NSString * const DCDictionaryKeySubtitle = @"subtitle";
NSString * const DCDictionaryKeyCount = @"count";
// 在使用上則是這樣:
NSDictionary<NSString *, id> *dict = @{......};
NSString *title = dict[DCDictionaryKeyTitle];
NSString *subtitle = dict[DCDictionaryKeySubtitle];
NSInteger count = [dict[DCDictionaryKeyCount] integerValue];
复制代码
這樣的寫法在 Objective-C 時代沒什麼問題,畢竟過去十幾年來 Objective-C 都是這樣寫的,但現在 Swift 出現了,我們就應該考慮 Objecitv-C 與 Swift 混用的情況。來看一下上面的常數宣告在 import 到 Swift 之後的使用方式:
// Objective-C 的常數被自動轉換成
let DCDictionaryKeyTitle: String = "title"
let DCDictionaryKeySubtitle: String = "subtitle"
let DCDictionaryKeyCount: String= "count"
// dict 的型別
let dict: [String: Any] = [......]
// 使用
let title = dict[DCDictionaryKeyTitle] as! String
let subtitle = dict[DCDictionaryKeySubtitle] as! String
let count = dict[DCDictionaryKeyCount] as! Int