Swift & Objc 在同一個項目中的使用

來源:互聯網
上載者:User

標籤:des   style   blog   http   color   使用   

在WWDC大會中發布了Swift讓人眼前一亮。終於加了很多的現代程式設計語言該有的東西。很早年以前玩C#3.0+的時候這些差不多類似的

已經用的爛熟的東西終於一點一點的在看Swift Programming Language的時候再喚醒。

 

 

Swift較之於OC(Objective-C)在愈發上幾乎是一門新的語言了,幸運的是Swift和OC都是出自蘋果大家庭,還能在一張桌子上吃飯。也就是說在升級項目

的時候你可以考慮使用Swift開發新的功能,調用已有的部分或者被已有的部分調用。或者在Swift開發的項目中使用已有的OC、C庫。這樣

Swift和OC共用開發一個app或者framework和只用其中一種是一樣一樣。當然混和語言開發app和framework上還是略有不同。

 

先說說開發app的時候混合代碼編程

在Swift代碼的app中無法直接引入添加的OC代碼。所以在你給Swift app中添加OC檔案或者在OC的app中添加Swift檔案的時候Xcode會

詢問你是不是要建立一個Bridging header的東西。有這個bridging headerSwfit和OC的檔案之間就可以互相訪問了。

                                 

產生出來的這個特殊的header檔案是以你的app的名稱加上“-Bridging-Header.h"的方式命名的。比如我的app的名字叫”MySwiftApp“,那

麼產生出來的就叫做”MySwiftApp-Bridging-Header.h”。

 

在Swift中引入OC代碼

    1. 在OC的Briding header檔案中引入你要暴露給Swift的標頭檔。比如:

1 #import "XYZCustomCell.h"2 #import "XYZCustomView.h"3 #import "XYZCustomViewController.h"

 

    2. 確保Build Settings中Briding header的路徑是直接指向這個檔案本身,而不是其所在的目錄。就像這樣:

    

一般來說這個檔案會預設產生,不用去管他就可以了。

 

只要是放在Briding header裡的OC標頭檔,在Swift中就是可見的。沒有任何import語句,OC檔案裡的方法也在Swift中可見,任意的Swift檔案中可見。然後你就可以像系統產生的Swift代碼那樣調用你的OC代碼了。

 

1 let myCell = XYZCustomCell()2 myCell.subtitle = "A custom cell"

 

 

在OC中引入Swift代碼

 

這個就方便的多了。系統在你看不見的時候就會預設的產生一個以你的app的名字加“-Swift.h”的標頭檔。顯然這是一個OC風格的標頭檔,因為你要在OC代碼中調用Swift代碼。這個標頭檔和前面說的Briding header檔案是一樣的。強調一點,你什麼都不用做,系統就會預設的產生這個檔案。你需要知道的就是這個檔案的命名方式:“你的app的名字-Swift.h”。在需要調用Swift代碼的OC源檔案中import這個檔案。在這個檔案中全部的OC的類型都有。如果你在Swift中使用了自訂的OC類型,那麼記住在import這自動產生的檔案之前,import你自訂的OC類型檔案!樣本:

 

#import “你的app的名字-Swift.h”

 

包含了這個檔案之後,全部的Swift檔案在這個OC的源檔案中都是可見的。

 

 

這裡總結一下。在Swift中使用OC,需要一個顯式預設產生的Briding header檔案,在這個檔案中列出來的全部OC檔案在Swift中都是可見的。也就是沒有必要再在哪裡import這個Briding header檔案。在OC中使用Swift,Xcode會隱式的預設產生一個“你的app的名字-Swift.h”檔案,在哪裡用就在那裡的OC源檔案中import這個頭文件。Swift檔案的全部類型都對這個源檔案可見。如果Swift中使用了其他的自訂OC類型,則在import“你的app的名字-Swift.h”之前引入這個自訂OC類型的標頭檔。

 

在同一個Framework中混合使用代碼

在Swift中使用OC。這個原文中似乎有一個錯誤。下見詳細:

    1. 首先確定Build Settings的Allow Non-modular includes in Framework Modules設定為Yes(注,原文中說的是Defines Module setting for that framework target is set to Yes。但是這裡預設為yes,而且添加代碼之後會報錯)。或者把你添加的OC代碼都放到Build Targe的public裡面(預設的是project)。

    2. 在umbrella標頭檔中,import你要暴露給Swift的OC代碼的標頭檔。例如:

  #import <MySwiftFramework/OCCode.h>

注意:在引入的時候需要在你的OC標頭檔前面加上Framework名稱!

這樣Swift就可以訪問你在umbrella標頭檔中引入的全部OC標頭檔。同時這些OC標頭檔對應的源檔案內容在無需其他import的情況下也就可以自動在Swift代碼中訪問到了。按照Swift的文法使用引入的OC類型,如:

1 import Foundation2 3 class SwiftClass{4     init(){5     6     }7     8     var test_code = OCCode()9 }

 

在OC中引入Swift

在OC代碼的code base中引入Swift代碼。你不需要在umbrella標頭檔中引入任何的Swift檔案。

 這部分按照文檔測試不過,稍後更新了。

 

 

 

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.