這是一個(gè)非常簡單的問題,但是不知道怎么用的時(shí)候,還真不一定是簡單問題;在網(wǎng)上搜了好幾篇文章,一個(gè)非常簡單的問題,被東拉西扯,說得非常復(fù)雜,不知所云,有篇還是某名人寫的,居然從手把手教如何建demo工程開始,然后這樣那樣的搞了一堆……
準(zhǔn)備工作
當(dāng)我們建的OC工程,添加Swift文件時(shí),或者建的Swift工程,添加OC文件時(shí),Xcode會提示我們是否添加Bridge文件,如下圖:

我創(chuàng)建的工程是個(gè)OC工程,并創(chuàng)建名叫ASwiftFile.swift的文件;從上圖可以看到,工程名叫Swift-OC-Swift,點(diǎn)擊Create Bridging Header就好。
然后,查看工程目錄,會發(fā)現(xiàn)多個(gè)一個(gè)header文件,叫Swift-OC-Swift-Bridging-Header.h,如下圖:

這個(gè)文件的命名規(guī)則是ProjectName-Bridging-Header.h。
OC與Swift間的調(diào)用
Swift 調(diào)用 OC 代碼
直接在Swift-OC-Swift-Bridging-Header.h中,寫入比如
#import "ViewController.h"
之類的import代碼,則ASwiftFile.swift就可以訪問到ViewController.h中的OC聲明了。
注意:上面Swift-OC-Swift-Bridging-Header.h中的Swift-OC-Swift是工程的名字,不同工程是不同的~~
OC 調(diào)用 Swift 代碼
直接在OC文件中添加
#import "Swift-OC-Swift-Swift.h"
即可讓該OC文件中調(diào)用Swift文件的聲明了。
注意:同樣,上面Swift-OC-Swift-Swift.h中的Swift-OC-Swift是工程的名字,不同工程是不同的~~
命名規(guī)則ProjectName-Swift.h是Xcode默認(rèn)的,這個(gè)文件是Xcode生成的,不需要我們?nèi)リP(guān)心,并且也不會出現(xiàn)在工程目錄中;這個(gè)文件中Xcode幫我們?yōu)镾wift編寫的代碼寫了一份OC的聲明,所以O(shè)C代碼引用這個(gè)文件后,就可以調(diào)用Swift編寫的代碼了。
不成功?看這里
Bridge文件位置問題
調(diào)用不成功的,多半是因?yàn)锽ridge文件的名字有問題,這時(shí),我們在Xcode中看一下:
Swift-OC-Swift target -> Build Settings -> Swift Compile - General
大概樣子,如下圖所示:

看一看Bridge文件聲明的位置是不是正確的,不正確就改正確。
NSObject繼承問題
特別注意,查看一下Swift文件中聲明的Class是否是繼承自NSObject的。如果不是,那么ProjectName-Swift.h文件里面也不會有相應(yīng)的OC聲明出現(xiàn)的。想一想,OC的所有類都是繼承自NSObject的,如果Swift中聲明的不是繼承NSObject的類,OC如何使用?
解決掉上面的問題之后,就大功告成了~~
*-Swift.h 文件里有什么?
目前ASwiftFile.swift文件中是這樣的代碼
import Foundation
class ASwiftFile : NSObject {
var aString: String?
func function_1() -> String {
return "This is function 1"
}
func function_2() {
}
}
看看Swift-OC-Swift-Swift.h文件有什么,看看就好,我就只截取與ASwiftFile.swift相關(guān)的內(nèi)容吧
// Generated by Apple Swift version 3.0.1 (swiftlang-800.0.58.6 clang-800.0.42.1)
// ...... 省略非常多的內(nèi)容
SWIFT_CLASS("_TtC14Swift_OC_Swift10ASwiftFile")
@interface ASwiftFile : NSObject
@property (nonatomic, copy) NSString * _Nullable aString;
- (NSString * _Nonnull)function_1;
- (void)function_2;
- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER;
@end
// ......