自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Swift和Objective-C如何兼顧?且看@objc和Dynamic

移動(dòng)開發(fā) iOS
Objective-C經(jīng)過了二十多年的洗禮,Cocoa框架早就烙上了不可磨滅的印記。無數(shù)的第三方庫是用Objective-C寫成的,這些積累無論是誰都不能小覷。因此,在最初的版本中,Swift不得不考慮與Objective-C的兼容。

雖然說 Swift 語言的初衷是希望能擺脫 Objective-C 的沉重的歷史包袱和約束,但是不可否認(rèn)的是經(jīng)過了二十多年的洗禮,Cocoa 框架早就烙上了不可磨滅的 Objective-C 的印記。無數(shù)的第三方庫是用 Objective-C 寫成的,這些積累無論是誰都不能小覷。因此,在最初的版本中,Swift 不得不考慮與 Objective-C 的兼容。

Apple 采取的做法是允許我們在同一個(gè)項(xiàng)目中同時(shí)使用 Swift 和 Objective-C 來進(jìn)行開發(fā)。其實(shí)一個(gè)項(xiàng)目中的 Objective-C 文件和 Swift 文件是處于兩個(gè)不同世界中的,為了讓它們能相互聯(lián)通,我們需要添加一些橋梁。

首先通過添加 {product-module-name}-Bridging-Header.h 文件,并在其中填寫想要使用的頭文件名稱,我們就可以很容易地在 Swift 中使用 Objective-C 代碼了。Xcode 為了簡化這個(gè)設(shè)定,甚至在 Swift 項(xiàng)目中第一次導(dǎo)入 Objective-C 文件時(shí)會(huì)主動(dòng)彈框進(jìn)行詢問是否要自動(dòng)創(chuàng)建這個(gè)文件,可以說是非常方便。

但是如果想要在 Objective-C 中使用 Swift 的類型的時(shí)候,事情就復(fù)雜一些。如果是來自外部的框架,那么這個(gè)框架與 Objective-C 項(xiàng)目肯定不是處在同一個(gè) target 中的,我們需要對(duì)外部的 Swift module 進(jìn)行導(dǎo)入。這個(gè)其實(shí)和使用 Objective-C 的原來的 Framework 是一樣的,對(duì)于一個(gè)項(xiàng)目來說,外界框架是由 Swift 寫的還是 Objective-C 寫的,兩者并沒有太大區(qū)別。我們通過使用 2013 年新引入的 @import 來引入 module:

  1. @import MySwiftKit; 

之后就可以正常使用這個(gè) Swift 寫的框架了。

如果想要在 Objective-C 里使用的是同一個(gè)項(xiàng)目中的 Swift 的源文件的話,可以直接導(dǎo)入自動(dòng)生成的頭文件 {product-module-name}-Swift.h 來完成。比如項(xiàng)目的 target 叫做 MyApp 的話,我們就需要在 Objective-C 文件中寫

  1. #import "MyApp-Swift.h" 

但這只是故事的開始。Objective-C 和 Swift 在底層使用的是兩套完全不同的機(jī)制,Cocoa 中的 Objective-C 對(duì)象是基于運(yùn)行時(shí)的,它從骨子里遵循了 KVC (Key-Value Coding,通過類似字典的方式存儲(chǔ)對(duì)象信息) 以及動(dòng)態(tài)派發(fā) (Dynamic Dispatch,在運(yùn)行調(diào)用時(shí)再?zèng)Q定實(shí)際調(diào)用的具體實(shí)現(xiàn))。而 Swift 為了追求性能,如果沒有特殊需要的話,是不會(huì)在運(yùn)行時(shí)再來決定這些的。也就是說,Swift 類型的成員或者方法在編譯時(shí)就已經(jīng)決定,而運(yùn)行時(shí)便不再需要經(jīng)過一次查找,而可以直接使用。

顯而易見,這帶來的問題是如果我們要使用 Objective-C 的代碼或者特性來調(diào)用純 Swift 的類型時(shí)候,我們會(huì)因?yàn)檎也坏剿枰倪@些運(yùn)行時(shí)信息,而導(dǎo)致失敗。解決起來也很簡單,在 Swift 類型文件中,我們可以將需要暴露給 Objective-C 使用的任何地方 (包括類,屬性和方法等) 的聲明前面加上 @objc 修飾符。注意這個(gè)步驟只需要對(duì)那些不是繼承自 NSObject 的類型進(jìn)行,如果你用 Swift 寫的 class 是繼承自 NSObject 的話,Swift 會(huì)默認(rèn)自動(dòng)為所有的非 private 的類和成員加上 @objc。這就是說,對(duì)一個(gè) NSObject 的子類,你只需要導(dǎo)入相應(yīng)的頭文件就可以在 Objective-C 里使用這個(gè)類了。

@objc 修飾符的另一個(gè)作用是為 Objective-C 側(cè)重新聲明方法或者變量的名字。雖然絕大部分時(shí)候自動(dòng)轉(zhuǎn)換的方法名已經(jīng)足夠好用 (比如會(huì)將 Swift 中類似 init(name: String) 的方法轉(zhuǎn)換成 -initWithName:(NSString *)name 這樣),但是有時(shí)候我們還是期望 Objective-C 里使用和 Swift 中不一樣的方法名或者類的名字,比如 Swift 里這樣的一個(gè)類:

  1. class 我的類 {  
  2.     func 打招呼(名字: String) {  
  3.         println("哈嘍,\(名字)")  
  4.     }  
  5. }  
  6.  
  7. 我的類().打招呼("小明"

Objective-C 的話是無法使用中文來進(jìn)行調(diào)用的,因此我們必須使用 @objc 將其轉(zhuǎn)為 ASCII 才能在 Objective-C 里訪問:

  1. @objc(MyClass)  
  2. class 我的類 {  
  3.     @objc(greeting:)  
  4.     func 打招呼(名字: String) {  
  5.         println("哈嘍,\(名字)")  
  6.     }  

我們在 Objective-C 里就能調(diào)用 [[MyClass new] greeting:@"XiaoMing"] 這樣的代碼了 (雖然比起原來一點(diǎn)都不好玩了)。另外,正如上面所說的以及在 Selector 一節(jié)中所提到的,即使是 NSObject 的子類,Swift 也不會(huì)在被標(biāo)記為 private 的方法或成員上自動(dòng)加 @objc。如果我們需要使用這些內(nèi)容的動(dòng)態(tài)特性的話,我們需要手動(dòng)給它們加上 @objc 修飾。

添加 @objc 修飾符并不意味著這個(gè)方法或者屬性會(huì)變成動(dòng)態(tài)派發(fā),Swift 依然可能會(huì)將其優(yōu)化為靜態(tài)調(diào)用。如果你需要和 Objective-C 里動(dòng)態(tài)調(diào)用時(shí)相同的運(yùn)行時(shí)特性的話,你需要使用的修飾符是 dynamic。一般情況下在做 app 開發(fā)時(shí)應(yīng)該用不上,但是在施展一些像動(dòng)態(tài)替換方法或者運(yùn)行時(shí)再?zèng)Q定實(shí)現(xiàn)這樣的 "黑魔法" 的時(shí)候,我們就需要用到 dynamic 修飾符了。在之后的 KVO 一節(jié)中,我們還會(huì)提到一個(gè)關(guān)于使用 dynamic 的實(shí)例。

責(zé)任編輯:林師授 來源: http://swifter.tips/
相關(guān)推薦

2015-04-17 16:30:46

swiftOC

2014-10-13 09:54:08

Objective-CSwift

2014-07-01 09:22:01

SwiftObjective-CiOS

2017-04-07 16:00:59

SwiftObjective-CFramework

2013-05-02 10:51:17

iOS開發(fā)Objective-C@property

2015-06-08 10:02:40

swiftOC兼容

2011-07-08 18:44:09

Objective-C Self Super

2014-09-24 11:15:05

Objective-CSwift

2014-09-26 09:49:48

SwiftObjective-C

2014-06-05 13:54:03

SwiftiOSObjective-C

2011-07-29 15:47:21

iPhone開發(fā) Objective- C

2012-06-25 10:14:33

WindowsGNUstepObjective-C

2011-07-21 09:42:27

Objective-C 內(nèi)存 Autoreleas

2011-07-19 15:15:09

Objective-C 內(nèi)存

2011-07-28 18:11:18

Objective-C Cocoa 編程

2013-04-11 14:32:00

Objective-CiOS開發(fā)內(nèi)存管理@synthesize

2011-08-04 13:55:10

Cocoa Objective- 文件

2011-07-06 11:19:45

Objective-C

2011-08-04 13:32:21

Objective-C 方法 對(duì)象

2011-07-06 14:12:14

Objective-C
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)