[iOS] Swift與Objective-C混編

一. 創(chuàng)建Objective-C混編橋接文件

當(dāng)Swift與OC混編時,需要創(chuàng)建橋接文件,才能在OC中使用Swift, 或者在Swift中使用OC的一些文件,橋接文件的默認命名規(guī)則是 fileName-Brigding-Header.h

fileName: 自定義文件名稱
-Brigding-Header.h : 固定寫法
也可以不按此規(guī)則, 根據(jù)自己需求自定義, 沒有影響;

下面就來看看具體的創(chuàng)建步驟:

1.1. 方式一: 自動生成

最簡單的創(chuàng)建方法就是, 在Swift項目中新建一個OC的文件, 或者在一個OC的項目中新建一個Swift文件, Xcode都會自動提示, 是否創(chuàng)建Header, 點擊新建即可;

1.2. 方式二: 手動創(chuàng)建

手動創(chuàng)建需要兩步:

1.2.1. 創(chuàng)建頭文件

左側(cè)文件列表,右鍵選擇New File... -->選擇Header File

選擇Header File

下一步,起個文件名稱,這里是: Test-Brigding-Header

Test-Brigding-Header

新建的文件如下:

Test-Brigding-Header.h
1.2.2. 配置路徑

接下來配置橋接文件的路徑:
來到項目的Build Settings,搜索 bridging,回車;
Swift Compiler-General中選擇Objective-C Bridging Header
右側(cè)空白處,雙擊在彈出框中輸入橋接文件的路徑: 文件路徑/文件名稱
這里的橋接文件在HeaderBridgeTest文件夾下,
所以只需輸入:HeaderBridgeTest/Test-Brigding-Header.h

添加橋接文件路徑

編譯,無報錯,即添加成功.

PS:如果橋接文件在其他的文件夾下,路徑中要添加上這層文件夾,例如:

這里多了一層文件Test文件夾

這里將橋接文件放在Test文件夾下,路徑中多了一層Test文件夾.

注意:
在添加橋接路徑的時候,有的人說,可以直接將橋接文件拖拽到彈出框內(nèi),自動生成一個完整路徑,如下:

創(chuàng)建文件.gif

這樣雖然也可以添加,編譯也沒用問題,但是一旦換一臺電腦,運行此項目,肯定會報路徑錯誤,所以這種方式是不可取的.

二. Swift中使用OC的類庫

如果在Swift項目使用OC語言的類庫, 只需要把要使用的OC文件的頭文件添加到這個橋接文件即可,這里添加了MBProgressHUD:

導(dǎo)入頭文件

PS: 如果是使用cocoapods管理的OC的第三方庫, 在引用頭文件的時候, 要加上外層文件夾路徑, 例如這里的MBProgressHUD如果是使用cocoapods加載, 應(yīng)該這樣在橋接文件引用頭文件:

#import "MBProgressHUD/MBProgressHUD.h"

然后在需要的地方,直接使用即可:

使用HUD

如果在使用時,沒有代碼補全提示,或者強打后,報錯,可Clean一下項目,再使用...

三. OC項目中使用Swift文件

如果在OC項目中使用Swift文件, 依然需要添加這個橋接文件, 但是不在里面引入Swift的頭文件(Swift也沒有頭文件),而是引用:

#import "項目名稱-Swift.h"

這里是默認名稱, 如果添加橋接文件后, 沒有做任何更改, 直接這么寫就行, 例如下面這個項目:

屏幕快照 2017-11-29 下午2.01.10.png

這是一個OC的項目, 我新建了一個SwiftPeople.swift文件:

class SwiftPeople: NSObject {

    var name = ""
    var age = 0
    
    
    init(_ name: String, age: Int) {
        self.name = name
        self.age = age
    }
    
    func isCanWork() {
        if self.age >= 18 {
            print("\(name), 您好!\n恭喜您, 可以參加工作!")
        } else {
            print("\(name), 您好!\n抱歉, 您未滿18歲, 不能參加工作!")
        }
    }
}

注意: 如果想在OC中使用Swift自定義的類, 這個自定義的類需要繼承自NSObject, 否則是無法使用的.

使用的時候可以按照下面的方式:

#import "ViewController.h"
#import "Test-Swift.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    SwiftPeople *people = [[SwiftPeople alloc]init:@"張三" age:16];
    
    [people isCanWork];
    
    
}
@end

運行會輸出:

張三, 您好!
抱歉, 您未滿18歲, 不能參加工作!

上面是使用的默認的文件名稱, 即:

#import "Test-Swift.h"

這個可以根據(jù)自己的需求修改的:
在 Build Settings 搜索: Product Module Name

Product Module Name

這里是默認的 Test, 可以修改為你要的名稱, 例如: MyTest :


使用的時候就需要引入頭文件:

#import "MyTest-Swift.h"

上面例子可改寫為:

#import "ViewController.h"
#import "MyTest-Swift.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    SwiftPeople *people = [[SwiftPeople alloc]init:@"張三" age:16];
    
    [people isCanWork];
    
    
}
@end

(完)

Github LQQZYY
CSDN博客 流火緋瞳
新浪微博 杯水_滄海
QQ 302934443
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容