一亿鲜、OC調(diào)用swift文件
這里創(chuàng)建一個名為Test的OC項目
在OC項目中創(chuàng)建一個swift文件Person.swift允青,會提示是否創(chuàng)建橋接文件遣耍。這個橋接文件是用于swift調(diào)用OC的,可以創(chuàng)建焚辅,若不創(chuàng)建則后續(xù)手動創(chuàng)建也是可以的岸更。
編譯器會為我們自動創(chuàng)建一個隱藏的Test-swift.h文件鸵膏。
1、只要在OC文件里引入這個文件就可以使用swift文件怎炊。
2谭企、這個文件名稱默認是:Product Module Name-Swift.h
。
3评肆、如果不希望使用默認名稱债查,也可以自定義,在Build Settings中找到Object-C Generated interface Header Name瓜挽,這里可以自定義用于引入的swift頭文件名稱盹廷,一般格式為:Name-Swift.h
,若修改了文件名稱久橙,需重新編譯才可以識別到俄占。注意,當工程名稱中有橫線時淆衷,會被自動轉(zhuǎn)換為下劃線缸榄。
4、xcode會根據(jù)swift代碼生成對應的OC聲明祝拯,寫入到Name-Swift.h
文件中甚带,可以點進去查看。代碼調(diào)用
1佳头、swfit類要暴露給OC調(diào)用鹰贵,這個類必須要繼承自
NSObject
。
因為OC調(diào)用方法使用的是runtime
的消息機制康嘉,類需要有isa
指針碉输,但是swift類是沒有的,所以要繼承自NSObject
基類亭珍,才會有isa
指針敷钾。2、swift類需要暴露給OC調(diào)用的成員和方法需要用
@objc
來修飾一下块蚌。
具體代碼如下:
Person.swift文件代碼:
class Person: NSObject {
@objc var age : Int = 0
@objc init(age: Int) {
self.age = age
}
}
如果覺得每個成員和方法都要用@objc來暴露太繁瑣,也可以使用@objcMembers
來暴露所有的成員和方法膘格。
@objcMembers class Person: NSObject {
var age : Int = 0
init(age: Int) {
self.age = age
}
}
OC文件調(diào)用swift代碼:
#import "Test-swift.h"
Person *p = [[Person alloc] initWithAge:10];
NSLog(@"%ld", p.age);
-
修改暴露的成員名稱峭范、方法名以及類名
@objc
除了可以暴露成員和方法外,還可以修改它們暴露出去的名稱瘪贱,也可以修改暴露出去的類名纱控。
swfit文件代碼
@objc(JJPerson)
@objcMembers class Person: NSObject {
var age : Int = 0
init(age: Int) {
self.age = age
}
@objc(JJSay)
func say() {
print("hello")
}
}
OC調(diào)用swift代碼
#import "JJ-swift.h"
JJPerson *p = [[JJPerson alloc] initWithAge:10];
[p JJSay];
OC文件中使用導入的swift第三方庫
導入swift第三方庫時辆毡,會自動創(chuàng)建一個不可見的文件 庫名-Swift.h
例如:
導入IQKeyboardManagerSwift
三方庫,會自動生成IQKeyboardManagerSwift-Swift.h
文件甜害,在需要使用IQKeyboardManagerSwift
庫的OC文件里#import "IQKeyboardManagerSwift-Swift.h"
就可以使用它了舶掖。
使用示例:[IQKeyboardManager shared].enable = YES;
二、swift調(diào)用OC
創(chuàng)建橋接文件
1尔店、一般在OC項目中第一次創(chuàng)建swift文件或者在swift項目中第一次創(chuàng)建OC文件時xcode會彈出詢問我們是否需要創(chuàng)建這個文件眨攘,點擊確定即可自動創(chuàng)建一個。
2嚣州、默認名稱為工程名-Bridging-Header.h
鲫售,我的工程名為Test
所以默認為Test-Bridging-Header.h
3、如果沒有自動創(chuàng)建该肴,那么手動創(chuàng)建一個工程名-Bridging-Header.h
文件也是可以的情竹。
4、如果不想使用默認的名字匀哄,也可以修改名稱秦效,但是要在Build-Setting->Objective-C Bridging Header中將配置修改為想要的文件路徑。在橋接文件中導入供swfit調(diào)用的OC文件
swift文件調(diào)用OC
三涎嚼、思考
-
1阱州、OC調(diào)用swift方法走的是runtime機制嗎?
是铸抑!因為swift類繼承自NSObject才能讓OC使用贡耽,所以類也有isa指針,runtime消息機制就是通過isa指針來尋找方法鹊汛。
OC調(diào)用swift的JJSay方法蒲赂,斷點查看匯編可以看到紅框部分的注釋,有調(diào)用objc_msgSend刁憋,這個就是OC運行時的消息發(fā)送機制滥嘴。
-
2、swift調(diào)用OC方法走的是runtime機制嗎至耻?
是若皱!因為OC方法在.m文件里編譯,所以肯定是runtime機制尘颓。
swift調(diào)用OC的eat方法走触,斷點查看匯編可以看到紅框部分的注釋,有調(diào)用objc_msgSend疤苹,這個就是OC運行時的消息發(fā)送機制互广。
-
3、swift類繼承了NSObject,并且也用@objc或者@objcMembers暴露了方法惫皱,在swift文件里直接使用這個類的方法是走的runtime機制嗎像樊?
不會!
查看匯編可以看到旅敷,調(diào)用方法這里并沒有objc_msgSend生棍。
-
4、swift文件調(diào)用swift方法希望它使用runtime怎么做呢媳谁?
在方法前加上dynamic
關(guān)鍵字修飾涂滴,如:dynamic func say() {print("hello")}
查看匯編,可以看到調(diào)用say方法時的注釋有objc_msgSend韩脑。