1、創(chuàng)建一個(gè)Swift或者是OC的工程
下面以Swift工程舉例绢彤,OC工程操作是一樣的
創(chuàng)建好的時(shí)候自動(dòng)生成我們熟知的幾個(gè)文件
2、此時(shí)我們創(chuàng)建一個(gè)OC的class或者是拷貝進(jìn)來一個(gè)都會(huì)出現(xiàn)如下提示
選擇yes之后桃序,會(huì)自動(dòng)生成如下文件
這個(gè)文件是xcode自動(dòng)為我們生成的Swift中使用OC的橋接文件杖虾。
Person類的實(shí)現(xiàn)如下:
此時(shí)我們就可以在Swift文件中使用OC的類了:
Swift中使用OC就結(jié)束了。
4媒熊、此時(shí)OC類中還是不能使用Swift的奇适,我們作如下操作:
5、先創(chuàng)建一個(gè)新的Swift類芦鳍,回到我們的Person類中嚷往,引入一個(gè)形如"工程名-Swift.h"的文件,OC類中就可以使用Swift內(nèi)容了柠衅。
我們可以command+Mixed_Sample-Swift.h進(jìn)去看一下:
這個(gè)文件會(huì)給我們自動(dòng)生成Swift類對(duì)應(yīng)的OC編碼的文件皮仁。
6、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)心,并且也不會(huì)出現(xiàn)在工程目錄中挤忙;這個(gè)文件中Xcode幫我們?yōu)镾wift編寫的代碼寫了一份OC的聲明霜威,所以O(shè)C代碼引用這個(gè)文件后,就可以調(diào)用Swift編寫的代碼了册烈。
不成功戈泼?看這里
Bridge文件位置問題
調(diào)用不成功的,多半是因?yàn)锽ridge文件的名字有問題茄厘,這時(shí)矮冬,我們?cè)赬code中看一下:
Swift-OC-Swift target->Build Settings->Swift Compile - General
大概樣子,如下圖所示:
操作步驟
看一看Bridge文件聲明的位置是不是正確的次哈,不正確就改正確胎署。
NSObject繼承問題
特別注意,查看一下Swift文件中聲明的Class是否是繼承自NSObject的窑滞。如果不是琼牧,那么ProjectName-Swift.h文件里面也不會(huì)有相應(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
// ......