1. 程式人生 > >oc 和 swift 混編

oc 和 swift 混編

作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/34440159 轉載請註明出處 如果覺得文章對你有所幫助,請通過留言或關注微信公眾帳號fengsh998來支援我,謝謝!

swift 語言出來後,可能新的專案直接使用swift來開發,但可能在過程中會遇到一些情況,某些已用OC寫好的類或封裝好的模組,不想再在swift 中再寫一次,哪就使用混編。這個在IOS8中是允許的。

先中簡單的入手,先研究在同一個工程目錄下混合使用的情況。

為了演示。先準備兩個類

第一個是swift語言寫的類,檔名為 act.swift

  1. import Foundation  
  2. class Act : NSObject  
  3. {  
  4.     func hasAct(tag:Int) -> String  
  5.     {  
  6.         switch (tag)  
  7.         {  
  8.         case 1:return"Movie"
  9.         case 2:return"CCTV"
  10.         case 3:return"Sport TV"
  11.         default:return"Area TV"
  12.         }  
  13.     }  
  14.     init()  
  15.     {  
  16.         println("act constructor is called."
    )  
  17.     }  
  18.     deinit  
  19.     {  
  20.         println("act destroyed is called.")  
  21.     }  
  22. }  

第二個是用OC寫的類 標頭檔案為OCChannel.h ,實現檔案為OCChannel.m

標頭檔案

  1. #import <Foundation/Foundation.h>
  2. @interface OCChannel : NSObject  
  3. @property (nonatomic,retain) NSString *ChannelName;  
  4. - (NSString *)ChannelChange:(NSInteger) channels;  
  5. @end  

實現檔案
  1. #import "OCChannel.h"
  2. #import "SwiftModule-swift.h"
  3. @interface OCChannel()  
  4. {  
  5.     Act     *act;  //swift的類
  6. }  
  7. @end  
  8. @implementation OCChannel  
  9. - (id)init  
  10. {  
  11.     if (self = [super init]) {  
  12.         NSLog(@"OC Constructor is called.");  
  13.         //使用Swift類
  14.         act = [[Act alloc]init];  
  15.     }  
  16.     return self;  
  17. }  
  18. - (void)dealloc  
  19. {  
  20.     NSLog(@"OC Destroyed is called.");  
  21.     //[act release];//ARC not use
  22.     //[super dealloc];//ARC not use
  23. }  
  24. - (NSString *)ChannelChange:(NSInteger) channels  
  25. {  
  26.     return [act hasAct:channels];  
  27. }  
  28. @end  

這個OCChannel為中引用了swift 寫的類Act 。主要是為了演示在同一個工程專案裡,swift類呼叫OC,同時OC類也呼叫Swift。從而形成一種混合編寫的模式。

下面是具體步驟:

1.新建一個Swift工程:我這裡工程名為MixDemo


建好後工程:


2.就是分別引入前面的兩個類,咱先一個個來。因為建的是Swift,所以,咱先以Swift工程中引用OC檔案進行一次混編

Swift中使用OC

首先Swift中不再使用標頭檔案和.m檔案的方式了。所以也不需要使用import ""來匯入標頭檔案。哪swift 如何能訪問到OC的類宣告的。

其實,swift也是需要使用標頭檔案進行訪問的,只不過不再需要使用顯式的方式使用import進行匯入。有兩種方式來實現這個標頭檔案的生成。

方式一:在一個全新的Swift,利用第一次新建提示的方式自動新增橋接標頭檔案。




點確定這後就會生成一個以<produceName-Bridging-Header.h>的標頭檔案。

建好後的工程:


這裡有一個地方需要注意的就是在targets->build settings ->Object-C Bridging Header 設為哪個橋接的標頭檔案即可。


經過上述步驟,橋接檔案弄好了就可以

盡情的把想要在swift類中呼叫的OC標頭檔案放使用import "" 寫到這個橋接檔案中吧。就像:

  1. //
  2. //  Use this file to import your target's public headers that you would like to expose to Swift.
  3. //MixDemo/MixDemo-Bridging-Header.h
  4. #import "OCChannel.h"

同樣的,當你知道這個swift搜尋標頭檔案的關係後,就不需要再理會這個-Bridging-Header.h的檔案了。完全可以手工建一個並取自己喜歡的名字。如:

方式二:

新建一個頭檔案,名為:OCContainerHeader.h


好了,以上的設定後就完全滿足了Swift使用OC寫的類了。

  1. import UIKit  
  2. class ViewController: UIViewController {  
  3.     override func viewDidLoad() {  
  4.         super.viewDidLoad()  
  5.         // Do any additional setup after loading the view, typically from a nib.
  6.         //呼叫OC類
  7.         var channel = OCChannel()  
  8.         println(channel.ChannelChange(10))  
  9.         println(channel.ChannelChange(2))  
  10.     }  
  11.     override func didReceiveMemoryWarning() {  
  12.         super.didReceiveMemoryWarning()  
  13.         // Dispose of any resources that can be recreated.
  14.     }  
  15. }  

好了下面再來看一下OC如何呼叫Swift寫的類。(事實上,如果你是一比一抄我這個DEMO,哪麼恭喜你,在以上你將編譯不通過。因為我的OC類中引用了swfit 寫的類,所以你要想執行,就必須把哪個Act 的類註釋了才行。)

OC如何呼叫Swift寫的類

OC要想使用,必須有標頭檔案。而swift檔案卻沒有標頭檔案,所在咱們想必也需要產生一個頭檔案。但對於OC呼叫swift  的標頭檔案比較特殊。因標頭檔案裡面的機制是自動生成的,在不熟悉的,不建議手寫。

哪如何產生這個標頭檔案。(注意,系統設定的標頭檔案,在工程中是看不到的。)

產生步驟:

選中targets->build settings ->packing->Product Module Name 中設定模組名,這個名稱很重要 swift 的標頭檔案就是根據這個來命名的。



雖然你看圖中有這個import "SwiftModule-swift.h"但你在整個工程中是找不到這個檔案的,但可以使用CMD+ 滑鼠點選可看這個標頭檔案中的內容。


這樣,工程中如查Swift要使用OC,則把需要使用的OC類的標頭檔案,全寫在MixDemo-Bridging-Header.h裡。同樣如果OC中所使用的swift類,只需要Clean一把,再編就可以了,但不要忘了匯入SwiftModule-swift.h哦(名稱自取,但-swift.h是固定的),另外還有一個需要讀者注意的。

注:

凡是用Swift寫的類,如果不繼成自NSObject或NSObject 的派生類,哪麼編譯後將不會生成對應的轉換類。從而使得OC 中找不到相應的宣告。

如我的例子中 class Act 這樣不會被編譯到SwiftModule-swift.h中,但寫為 class Act : NSObject,就可以編譯出相應的宣告。另外可以使用@objc加以宣告,但這個還是一樣,類最好繼承NSObject下來。就像下面:

  1. import Foundation  
  2. @objc(Act)  
  3. class Act   
  4. {  
  5.     func hasAct(tag:Int) -> String  
  6.     {  
  7.         switch (tag)  
  8.         {  
  9.         case 1:return"Movie"
  10.         case 2:return"CCTV"
  11.         case 3:return"Sport TV"
  12.         default:return"Area TV"
  13.         }  
  14.     }  
  15.     @objc(init)//原本以為加上這個alloc就可以找到,但不行的。。。
  16.     init()  
  17.     {  
  18.         println("act constructor is called.")  
  19.     }  
  20.     deinit  
  21.     {  
  22.         println("act destroyed is called.")  
  23.     }  
  24. }  

但是在使用時你就會發現

        act = [[Act alloc]init]; //報錯,找不到alloc,因此建議大家還是繼承NSObject.


好吧,今天就寫到這裡,再研究一下framework之間的混編。。。。。


相關推薦

oc swift的時候打包ipa安裝不了

contains 方法 not 三方 ref gravity mark c項目 track 做了一個oc項目。裏面實用到swift第三方,真機執行的時候是正常的

iOS 快速從OC過渡到Swift,由理論到實戰-OCSwift

接上篇文章:iOS 快速從OC過渡到Swift,由理論到實戰-Swift基礎 OC和Swift混編 a. Swift 和 OC 的對映關係 Swift 相容來大部分 OC,當然還有一些 Swift 不能夠使用的,例如 OC 中的預處理指令,即巨集定義不可使用,雖

OCswift包太大

關於object-c和swift混編問題,無論是在oc基礎上新增swift還是在swift上新增oc最後打出來的ipa的包都會大一到兩倍。因為這個原因可能有很多人會放棄混編,但是不用害怕,上傳iTun

oc swift

作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/34440159 轉載請註明出處 如果覺得文章對你有所幫助,請通過留言或關注微信公眾帳號fengsh998來支援我,謝謝! s

OC Swift OC 中呼叫 Swift

1、建立一個Object-C工程:SwiftInObjectC 2、建立一個Object-C的類:SwiftLan(注意選擇) 當建立完成後,Xcode提示下面警告,會提問我們需不需要創意一個Bridge,當然我們選擇“Yes”。 這樣會在工程中看到一個

iOS開發之OC Swift

前言 相信很多開發者在開發過程中,使用別人封裝好的三方框架,但由於三方框架的開發語言(OC或者Swift)與現有工程的開發語言不一致,導致無法直接使用,那麼對於混編來說,是不二的選擇。 Swift專案使用OC框架 1. 建立橋接檔案,一般的命名規則(專案名-Br

OCswift 雜記

ren use rom not 編譯 lfs 內嵌 uic chan 今天使用在swift項目上使用了oc項目的一部分源代碼發現了以下問題: 1. oc 無法繼承swift類 2. oc 無法使用 純swift類 3. 帶有閉包的函數無法被oc類調用 以上問題使得 oc 使

OCSwift

可能 完全 模式 -c after 產生 addition 沒有 派生 轉:原文地址:http://blog.csdn.net/fengsh998/article/details/34440159 swift 語言出來後,可能新的項目直接使用swift來開發,但可能在過程中

Objective-C Swift 項目的小 Tips(一)

markdown nag tomat tac 發現 tps tor ips 名稱 本文主要閑聊一些 Objective-C 和 Swift 混編項目帶來的一些潛規則,希望能幫到對此感到疑惑的朋友。下面我們開始進入主題: 命名 官方 Guide 上只是簡單敘述(Usin

OCSwift Swift的閉包傳值到OC

隨著Swift的日益完善,終究會取代OC的地位,就像Kotlin取代Java一樣,不是時間的問題,而是使用者願意不願意被時代淘汰的問題 首先是Swift中定義閉包 一定要注意在Swift的類前面加上@objcMembers,這樣才能在OC中引用;在引用的變數前面加上@objc

OCswift(橋接)

所謂橋接就是在OC 工程中第一次建立swift檔案的時候回生成一個頭檔案(Bridging-Header.h   橋)。 這裡主要是swift 呼叫OC方法的時候引入OC檔案.h 所使用的 第一次在OC工程中建立swift檔案生成的橋 標頭檔案, 此時路徑預設已生成,不

ocswiftOC呼叫swiftswift呼叫OC

1、oc工程呼叫swift-----自動建立橋接標頭檔案 建立一個oc工程: 設定Product Module Name = 工程名 建立一個swift檔案: 點選自動建立橋接標頭檔案: 設定Objective-C Bridging Header 如下圖:

初探swift語言的學習筆記九(OCSwift)

作者:fengsh998原文地址:http://blog.csdn.net/fengsh998/article/details/34440159轉載請註明出處如果覺得文章對你有所幫助,請通過留言或關注微信公眾帳號fengsh998來支援我,謝謝!swift 語言出來後,可能新

OC C++

先說題外話,文章標題其實起的不好,在iOS的開發中,Apple建立的庫基本都是用Objective-C寫的,所以在這裡的C++指的其實是Objective-C++。首先,最最最要緊的事情,不是程式碼而是編譯器選項,在做混合編譯之前一定要把編譯器的Compile Sources As選項改為Objective

小胖說swift04--------OCSwift

小知識: 1.oc和swift只能互相傳類,不能互傳常量等非class的部分2.Swift.h只能通過.m檔案引入,.h裡面要用swift的類需要申明@class 1.Swift呼叫OC 新建一個頭

iOS開發中實現OCSwift

背景: 最近又開始看了一些關於Swift的視訊、部落格、書,發現swift相對於OC使用起來更簡潔了,於是就想在原有專案中引入swift。原有的專案都是使用OC寫的,既然要在原有專案中引入swift檔案首先就要實現OC和swift的混編設定。 混編設定:

oc swift實踐問題總結

        swift已經慢慢變得越來越讓人喜歡了。所以,我們團隊開始嘗試探索把我們龐大的專案實現oc和swift的混編。至於為什麼不直接重構,那是因為實在是時間和事實不允許,畢竟我們的APP已

Objective_C與Swift遇到的坑(一)

ios工程 string類 一個 前段時間 開啟 需要 .com tar 更換 swift推出已經很長一段時間了,前段時間突然想嘗試一些簡單的類用swift編寫於是便開始了混編的路程。 1.在oc代碼裏引用swift類:找了很多資料需要添加頭文件格式為 #import "P

OCSwift中的static

  OC: static關鍵字表示靜態,能夠放在區域性變數和全域性變數前面: 限定作用域:對於靜態全域性變數來說,針對某一原始檔的以static宣告的檔案級變數與函式的作用域只限於檔案內(只在檔案內可見),也即“內部連線”,因而可以用來限定變數的作

爬坑:spark專案打包報錯(javascala)

專案打包:mvn clean package -DskipTests java和scala混編打包 報錯: /Users/rocky/source/work/sparktrain/src/main/scala/com/zoujc/spark/project/dao/CourseSearchC