Swift和OC混編

來源:互聯網
上載者:User

標籤:一個   switch   atom   bsp   使用   target   like   led   ftp   

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

這個在IOS8中是同意的。
先中簡單的入手,先研究在同一個project檔案夾下混合使用的情況。
為了示範。先準備兩個類
第一個是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 。

主要是為了示範在同一個project項目裡,swift類調用OC,同一時候OC類也調用Swift。從而形成一種混合編寫的模式。


以下是詳細步驟:
1.建立一個Swiftproject:我這裡project名為MixDemo

建好後project:

2.就是分別引入前面的兩個類,咱先一個個來。由於建的是Swift,所以,咱先以Swiftproject中引用OC檔案進行一次混編
Swift中使用OC
首先Swift中不再使用標頭檔和.m檔案的方式了。所以也不須要使用import ""來匯入標頭檔。

哪swift 怎樣能訪問到OC的類聲明的。


事實上,swift也是須要使用標頭檔進行訪問的,僅僅只是不再須要使用顯式的方式使用import進行匯入。有兩種方式來實現這個標頭檔的產生。
方式一:在一個全新的Swift,利用第一次建立提示的方式自己主動加入橋接標頭檔。





點確定這後就會產生一個以<produceName-Bridging-Header.h>的標頭檔。
建好後的project:

這裡有一個地方須要注意的就是在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  的標頭檔比較特殊。

因標頭檔中面的機制是自己主動產生的,在不熟悉的。不建議手寫。


哪怎樣產生這個標頭檔。(注意,系統設定的標頭檔。在project中是看不到的。)
產生步驟:
選中targets->build settings ->packing->Product Module Name 中設定模組名,這個名稱非常重要 swift 的標頭檔就是依據這個來命名的。


儘管你看圖中有這個import "SwiftModule-swift.h"但你在整個project中是找不到這個檔案的。但能夠使用CMD+ 滑鼠點擊可看這個標頭檔裡的內容。


這 樣。project中如查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.