OC使用Swift代碼

這是一個(gè)非常簡單的問題,但是不知道怎么用的時(shí)候,還真不一定是簡單問題;在網(wǎng)上搜了好幾篇文章,一個(gè)非常簡單的問題,被東拉西扯,說得非常復(fù)雜,不知所云,有篇還是某名人寫的,居然從手把手教如何建demo工程開始,然后這樣那樣的搞了一堆……

準(zhǔn)備工作

當(dāng)我們建的OC工程,添加Swift文件時(shí),或者建的Swift工程,添加OC文件時(shí),Xcode會提示我們是否添加Bridge文件,如下圖:

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,如下圖:

Bridging文件被創(chuàng)建

這個(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

// ......
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1、創(chuàng)建一個(gè)Swift或者是OC的工程 下面以Swift工程舉例,OC工程操作是一樣的 創(chuàng)建好的時(shí)候自動生成我們熟...
    LHsunshine閱讀 471評論 0 1
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,103評論 4 61
  • 這個(gè)是廣大網(wǎng)友評為最淺顯易懂Git教程的讀書筆記, 這個(gè)PDF文檔CSDN可以免積分下載.建議大家看看這個(gè)文檔,這...
    wg689閱讀 1,356評論 0 10
  • PROCESS 進(jìn)程一個(gè)程序 開啟一個(gè)進(jìn)程ps aux|less報(bào)告系統(tǒng)當(dāng)前的進(jìn)程狀態(tài) USER 進(jìn)程...
    Green_Apple閱讀 295評論 0 0
  • 用三個(gè)小時(shí)的時(shí)間聽完了入門版上午的課程 得到了以下的收獲: 一、什么是目標(biāo) 目標(biāo)是管理者所必備的基礎(chǔ)工具。是期望的...
    敏姐靜好閱讀 974評論 0 0

友情鏈接更多精彩內(nèi)容