Swift和OC混編

來源:互聯網
上載者:User

標籤:

swift 語言出來後,可能新的項目直接使用swift來開發,但可能在過程中會遇到一些情況,某些已用OC寫好的類或封裝好的模組,不想再在swift 中再寫一次,哪就使用混編。這個在IOS8中是允許的。
先中簡單的入手,先研究在同一個工程目錄下混合使用的情況。
為了示範。先準備兩個類
第一個是swift語言寫的類,檔案名稱為 act.swift


    1.    import Foundation 
    2.     
    3.    class Act : NSObject 
    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.         
    16.        init() 
    17.        { 
    18.            println("act constructor is called.") 
    19.        } 
    20.         
    21.        deinit 
    22.        { 
    23.            println("act destroyed is called.") 
    24.        } 
    25.    } 


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



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

實現檔案


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

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

方式二:
建立一個標頭檔,名為:OCContainerHeader.h


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


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

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

但是在使用時你就會發現

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

Swift和OC混編

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

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.