OC與swift相互調用
一、OC調用swift文件
二、swift調用OC文件
三、注意和總結
添加:
四、自定義橋接文件
一、OC調用swift文件
在OC項目中創建一個swift文件的時候,Xcode 會提示 需要創建一個橋接文件,點確定創建橋接文件,Xcode會自動創建一個橋接文件
名字:工程名-Bridging-Header.h
這個橋接文件是 swift 調用OC文件的時候用的
1、
進入TARGETS ->Build Settings -> Packaging 中
設置Defines Module為YES
設置 Product Module Name ,也可以不設置,默認為工程的名字。這個在后面會用到
2、
在swift寫一個類
注意這個類一定要繼承NSObject,不然在OC中沒法用
class hello: NSObject {
var address : String
var gender: String
init(address:String,gender:String){
self.address = address
self.gender = gender
}
func method() {
print("message \(self.address + self.gender)")
}
}
3、
在OC需要用到的swift文件中 導入文件
"Product Module Name -Swift.h" 因為
Product Module Name 默認是工程的名字
所以直接導入
#import "工程名-Swift.h"
4、
記着寫完先command +B編譯一下,如果沒有報錯就可以在OC文件調用swift中的類了
hello *helloss = [[helloalloc]initWithAddress:@"上海"gender:@"男"];
[helloss method];
二、swift調用OC文件
在swift項目中創建一個OC文件的時候,Xcode 會提示創建一個橋接文件 點確定創建橋接文件,Xcode會自動創建一個橋接文件
名字:工程名-Bridging-Header.h
把swift需要用到的OC文件的頭文件放到橋接文件里 工程名-Bridging-Header.h
例如:
1、
這個就是一個OC文件
//#import "sec.h"
#import <UIKit/UIKit.h>
@interface sec : UIViewController
-(void)actionMake;
@end
2、
在橋接文件中把需要用到OC的頭文件導入進去
#import "sec.h"
3、
編譯一下,就可以在swift中用swift的語法調用OC文件的方法了
let second = sec()
second.actionMake()
三、注意和總結
注意:
1、OC項目在導入swift文件前 先按照系統提示創建橋接文件,
2、在 targets -> Build Settings -> Packaging 中設置Defines Module 為YES
3、在OC中調用swift文件的時候,swift中的類 要繼承NSObject
不然沒辦法在OC中調用
4、OC中調用swift文件需要導入”工程名 -Swift.h"
(這個是build Setting -> Packaging->Product Module Name 的名字,而這個屬性默認是工程的名字)
5、寫完記得command + B 編譯 一下
6、swift項目 引用OC文件也需要創建 橋接文件,在這個橋接文件中導入OC文件的頭文件
7、橋接文件只有一個,作用只是為了 swift 引用OC文件,OC引用swift 文件雖然也需要創建橋接文件
但是不需要在橋接文件中 導入swift文件
8、如果一個項目既有OC引用swift 也有swift引用OC ,就先設置OC調用swift文件
在橋接文件 導入OC文件,OC可以定義PCH文件導入”工程名 -Swift.h"
四、自定義橋接文件
如果不用Xcode提示創建橋接文件也可以自定義一個橋接文件
1 使用 Header File 把里面的內容清空。
2、 這文件名可以自定義, 一般還是用 工程名-Bridging-Header.h 例如app - file.h
3 然后在 Build Setting -> Swift Compiler - Code Generation中
4、設置Objective-C Bridging Header 為自定義的橋接文件相對於工程的絕對路徑,也就是項目總文件夾的路徑,如果在第一層,就直接寫自定義的橋接文件的名file.h,如果在下一層,文件夾/橋接文件 app/file.h