1、創建一個Swift或者是OC的工程
下面以Swift工程舉例,OC工程操作是一樣的
創建好的時候自動生成我們熟知的幾個文件
2、此時我們創建一個OC的class或者是拷貝進來一個都會出現如下提示
選擇yes之后,會自動生成如下文件
這個文件是xcode自動為我們生成的Swift中使用OC的橋接文件。
Person類的實現如下:
此時我們就可以在Swift文件中使用OC的類了:
Swift中使用OC就結束了。
4、此時OC類中還是不能使用Swift的,我們作如下操作:
5、先創建一個新的Swift類,回到我們的Person類中,引入一個形如"工程名-Swift.h"的文件,OC類中就可以使用Swift內容了。
我們可以command+Mixed_Sample-Swift.h進去看一下:
這個文件會給我們自動生成Swift類對應的OC編碼的文件。
6、OC與Swift間的調用
Swift 調用 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 調用 Swift 代碼
直接在OC文件中添加
#import "Swift-OC-Swift-Swift.h"
即可讓該OC文件中調用Swift文件的聲明了。
注意:同樣,上面Swift-OC-Swift-Swift.h中的Swift-OC-Swift是工程的名字,不同工程是不同的~~
命名規則ProjectName-Swift.h是Xcode默認的,這個文件是Xcode生成的,不需要我們去關心,并且也不會出現在工程目錄中;這個文件中Xcode幫我們為Swift編寫的代碼寫了一份OC的聲明,所以OC代碼引用這個文件后,就可以調用Swift編寫的代碼了。
不成功?看這里
Bridge文件位置問題
調用不成功的,多半是因為Bridge文件的名字有問題,這時,我們在Xcode中看一下:
Swift-OC-Swift target->Build Settings->Swift Compile - General
大概樣子,如下圖所示:
操作步驟
看一看Bridge文件聲明的位置是不是正確的,不正確就改正確。
NSObject繼承問題
特別注意,查看一下Swift文件中聲明的Class是否是繼承自NSObject的。如果不是,那么ProjectName-Swift.h文件里面也不會有相應的OC聲明出現的。想一想,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相關的內容吧
// Generated by Apple Swift version 3.0.1 (swiftlang-800.0.58.6 clang-800.0.42.1)
// ...... 省略非常多的內容
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
// ......