(翻譯)如何將您的APP從Objective-C轉(zhuǎn)移到Swift颤霎?

自從蘋果在2014年發(fā)布了自己的Swift編程語言之后获印,很多開發(fā)人員都利用這個機(jī)會來測試它的特性,看看它是如何與Objective-C進(jìn)行比較的胆建。 一般結(jié)論似乎是: 在某些情況下烤低,Swift比Objective-C更可取。

Swift的優(yōu)點是什么笆载?

  1. Swift允許你編寫較少的代碼扑馁。
  2. Swift是強(qiáng)類型的,這意味著更少的處理類型不正確導(dǎo)致崩潰凉驻。
  3. Swift看起來類似于其他流行的編程語言腻要,類似于英語。
  4. Swift比它的前任Objective-C快涝登。

這些功能使Swift非常誘人雄家。 讓我們考慮如果你決定從Objective-C切換到Swift你需要做什么,并確定是否應(yīng)該轉(zhuǎn)移到Swift上胀滚。
值得一提的是趟济,Swift與Objective-C完全兼容。 Apple提供了一個混合和匹配功能咽笼,允許開發(fā)人員在同一個項目中使用這兩種語言顷编。 這意味著您可以向現(xiàn)有的代碼庫添加新的Swift功能。 同時剑刑,盡管Swift和Objective-C使用相同的API媳纬,但在從Objective-C遷移到Swift時,您必須記住一些差異施掏。

Optional 類型

在Objective-C中钮惠,你可以調(diào)用nil對象的方法(更準(zhǔn)確地說,你可以發(fā)送消息到nil對象)七芭,這些方法返回一個空值素挽。為了防止在出現(xiàn)意外的nil值時出現(xiàn)未定義的行為,您需要在需要時執(zhí)行nil檢查抖苦。 Swift引入了可選值的概念∶姿溃可選類型聲明為類似枚舉:

public enum可選<Wrapped>:_Reflectable锌历,NilLiteralConvertible

從編程上來說,它是一種類型峦筒,可以代表Wrapped類型的值或不存在的值究西。 Swift提供了使類型可選的語法糖,所以不需要聲明Optional <String>物喷,你可以只寫String卤材?您有兩個選項從可選容器獲取包裝的值遮斥。第一個是可選鏈接 - if-let條件語句僅當(dāng)它存在時才接收該值。如果您完全確定可選變量是非零扇丛,您可以使用強(qiáng)制解包术吗。這提供了存儲的值,如果存在帆精,沒有條件较屿,但是當(dāng)你犯了一個錯誤,并且可選實例為空時崩潰卓练。
除了常規(guī)可選項隘蝎,還有隱含的展開可選項,聲明為String襟企!讓我們來看看你可以用不同的方式聲明可選性嘱么。

class ExampleClass {   
    var nonOptionalString: String   
    var unwrappedOptionalString: String!   
    var optionalString: String?  
    init(string: String) {       
    nonOptionalString = string
   }
}

nonOptionalString永遠(yuǎn)不能為nil。 此屬性應(yīng)在對象初始化期間填充顽悼。 提供強(qiáng)制解包的nil對象將導(dǎo)致崩潰曼振。
unwrappedOptionalString可以是nil,但如果您嘗試訪問nil對象表蝙,您的程序?qū)⒈罎ⅰ?br> optionalString可以為nil拴测,應(yīng)被視為常規(guī)可選變量。
當(dāng)編寫Objective-C代碼時府蛇,可以使用_Nullable和_Nonnull類型注釋來標(biāo)記變量集索。 上面的Swift示例的Objective-C等價類似于:

 @interface ExampleClass: NSObject
 @property (nonatomic, strong) NSString * _Nonnull nonOptionalString;
 @property (nonatomic, strong) NSString *unwrappedOptionalString;  
 @property (nonatomic, strong) NSString * _Nullable optionalString;
 - (instancetype)initWithString:(nonnull NSString *string);
 @end

錯誤處理

當(dāng)在Objective-C中拋出和處理錯誤時,方法的最后一個參數(shù)是對NSError變量的引用汇跨。 如果此方法執(zhí)行導(dǎo)致不可接受的行為务荆,則應(yīng)創(chuàng)建一個NSError實例并將其寫入傳遞的變量。 在調(diào)用可能產(chǎn)生錯誤的方法后穷遂,您應(yīng)該檢查錯誤參數(shù)函匕,以確保它是非零。

- (nonnull NSString *)exampleMethod:(nonnull NSString *)param error:(NSError **)error { 
    if (!param.length) {       
            *error = [NSError errorWithDomain:[NSBundle mainBundle].bundleIdentifier                         
           code:-101                               
           userInfo:nil];       
    return nil; 
  }   // do work}

Objective-C還提供了一個具有傳統(tǒng)try-catch-finally語法的異常機(jī)制蚪黑,但是Apple強(qiáng)烈建議僅將其用于開發(fā)目的盅惜。
Swift要求您標(biāo)記使用throws關(guān)鍵字生成錯誤的方法。 如果該方法接受的最后一個參數(shù)是指向Objective-C接口中的NSError實例的指針忌穿,那么它將從Objective-C翻譯為Swift作為throwing方法抒寂,上面方法的聲明將轉(zhuǎn)換為 :

func exampleMethod(param:String)throws - > String

Objective-C允許你省略錯誤處理的錯誤返回方法,但在Swift你必須明確處理錯誤掠剑。 被拋出的對象應(yīng)該是Swift ErrorType的后代屈芜。

枚舉

Objective-C提供C風(fēng)格的枚舉,它只限于基本類型。 即使您需要將整數(shù)枚舉值映射到相應(yīng)的字符串以顯示給用戶或發(fā)送到后端井佑,也必須創(chuàng)建數(shù)組或字典 - 或使用switch語句属铁。 但Swift提供了全新的枚舉與更多的選擇。 Swift中的枚舉可以按照與Objective-C中相同的方式使用:

enum ExampleEnum {  
    case ExOne, ExTwo, ExThree  
}

Swift枚舉可以存儲關(guān)聯(lián)的值躬翁。 每個枚舉大小寫都可以包含一組預(yù)定義的字段焦蘑。

enum AnotherExampleEnum {   
   case ExOne(String, Int)  
   case ExTwo(Int)
}

Swift枚舉可以存儲原始值并遞歸。
Swift還有各種強(qiáng)大的功能姆另,它與Objective-C區(qū)別開來喇肋。 這些功能包括泛型,嚴(yán)格類型系統(tǒng)迹辐,類型推斷蝶防,元組和嵌套類型。 簡而言之明吩,從Objective-C遷移到Swift不是一件小事间学。 這里有一些提示,使過程更容易印荔。

從Objective-C遷移到Swift的提示

首先低葫,您應(yīng)該創(chuàng)建一個與相應(yīng)頭和實現(xiàn)文件名稱相同的.swift文件。 如果你需要從新的Swift文件中訪問Objective-C類仍律,你必須為它們添加一個import指令到橋接頭文件嘿悬。 如果你需要從Objective-C代碼訪問新的Swift類,你必須從Objective-C類繼承它; 否則將無法訪問水泉。 然后你必須手動重寫代碼善涨,采用Swift的最佳實踐并使類向下兼容。
如果你的Google“從Objective-C遷移到Swift”草则,你會發(fā)現(xiàn)幾個鏈接钢拧,建議自動翻譯代碼的工具。 有免費和付費解決方案炕横。 然而源内,即使付費的解決方案在它們的功能上極其有限。
為了看看這些工具是如何在Objective-C中創(chuàng)建一個非撤莸睿基本的游戲膜钓,然后嘗試使用幾個自動翻譯器將它翻譯成Swift。我們嘗試的第一個是基于Web的卿嘲,并允許您上傳一個完整的Xcode項目(但是只有當(dāng)項目小于10 MB)颂斜。結(jié)果真的沒有準(zhǔn)備好生產(chǎn) - 我們發(fā)現(xiàn)超過70個錯誤,即使我們的程序只有7個小類腔寡。這些錯誤包括不正確的可選焚鲜,不正確的類型推斷掌唾,留下最后一個參數(shù)為NSError放前,而不是切換到Swift錯誤處理與try-catch忿磅,從__weak不正確切換typeof(self)weakSelf = self;到[weak self]等。我們還測試了一個付費桌面應(yīng)用程序凭语,花費15美元葱她,但結(jié)果更糟。我們測試的桌面應(yīng)用程序無法導(dǎo)入整個項目似扔,因此我們不得不按文件復(fù)制和粘貼所有文件吨些。
行業(yè)中的大多數(shù)人都同意Swift正在成為iOS開發(fā)的主要語言,因此建議將它用于新項目炒辉。
方便地是豪墅,混合和匹配特性允許您使用Swift和Objective-C類作為同一項目的一部分,因此您不必花費時間重寫Swift中的整個現(xiàn)有代碼庫黔寇。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末偶器,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子缝裤,更是在濱河造成了極大的恐慌屏轰,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件憋飞,死亡現(xiàn)場離奇詭異霎苗,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)榛做,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進(jìn)店門唁盏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人瘤睹,你說我怎么就攤上這事升敲。” “怎么了轰传?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵驴党,是天一觀的道長。 經(jīng)常有香客問我获茬,道長港庄,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任恕曲,我火速辦了婚禮鹏氧,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘佩谣。我一直安慰自己把还,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著吊履,像睡著了一般安皱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上艇炎,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天酌伊,我揣著相機(jī)與錄音,去河邊找鬼缀踪。 笑死居砖,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的驴娃。 我是一名探鬼主播奏候,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼唇敞!你這毒婦竟也來了鼻由?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤厚棵,失蹤者是張志新(化名)和其女友劉穎蕉世,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體婆硬,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡狠轻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了彬犯。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片向楼。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖谐区,靈堂內(nèi)的尸體忽然破棺而出湖蜕,到底是詐尸還是另有隱情,我是刑警寧澤宋列,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布昭抒,位于F島的核電站,受9級特大地震影響炼杖,放射性物質(zhì)發(fā)生泄漏灭返。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一坤邪、第九天 我趴在偏房一處隱蔽的房頂上張望熙含。 院中可真熱鬧,春花似錦艇纺、人聲如沸怎静。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蚓聘。三九已至肠鲫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間或粮,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工捞高, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留氯材,地道東北人。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓硝岗,卻偏偏與公主長得像氢哮,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子型檀,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,675評論 2 359

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