你可以在 xcode 里同時使用 Swift 和 Objective-C(以下簡稱OC)來寫代碼,混搭編程的好處很多,比如允許大量代碼的復(fù)用,在性能和開發(fā)效率之間找到平衡等。
成都創(chuàng)新互聯(lián)成都網(wǎng)站建設(shè)按需網(wǎng)站設(shè)計,是成都網(wǎng)站開發(fā)公司,為搬家公司提供網(wǎng)站建設(shè)服務(wù),有成熟的網(wǎng)站定制合作流程,提供網(wǎng)站定制設(shè)計服務(wù):原型圖制作、網(wǎng)站創(chuàng)意設(shè)計、前端HTML5制作、后臺程序開發(fā)等。成都網(wǎng)站制作熱線:18982081108
我們建立一個工程時,XCode會詢問我們選擇什么語言進行開發(fā),如果你選擇的是OC,那么當你第一次新建一個swift文件時,開發(fā)環(huán)境會詢問你是否建立一個 .h 文件。這個 .h 文件命名方式是 "#ProjectName#-Bridging-Header.h" 。你可以讓開發(fā)環(huán)境幫你創(chuàng)建這個文件,也可以自己建,編譯器只認這個文件名,只要別寫錯就好。
我們稱這個文件叫橋接文件,它的作用是把OC代碼選擇性的暴露給swift,讓swift可以調(diào)用這些接口。
暴露的方式是通過import,也就是說,你可以在這個 .h 文件里 import 任何你想要暴露給swift的代碼,然后就可以在 swift 中訪問了。
動手實踐:
打開xcode,創(chuàng)建一個OC工程 HelloWorld
創(chuàng)建一個叫 HelloOC 的 OC 類,實現(xiàn)靜態(tài)方法 hello,實現(xiàn)代碼 NSLog("hello, OC.")
創(chuàng)建一個叫 HelloSwift 的 swift 類,繼承NSObject,實現(xiàn)靜態(tài)函數(shù) hello(),實現(xiàn)代碼 NSLog("hello, swift.")
這時候 xcode 會彈出詢問是否創(chuàng)建文件 HelloWorld-Bridging-Header.h ,選擇是,如果你點了否,就自己創(chuàng)建一個
在 HelloWorld-Bridging-Header.h 代碼里,加入 #import "HelloOC.h"
在HelloSwift 的 hello 函數(shù)里,在 NSLog("hello, swift.") 后追加 HelloOC.hello()
注意,繼承自 NSObject 這點很重要,因為OC所有類都是繼承自 NSObject,而 swift 沒有這個要求,所以如果需要暴露 swift 的類給 OC ,一定必須是 NSObject 的子類才行。
如果編譯成功了,那就說明編譯器允許讓你通過 HelloSwift 調(diào)用 HelloOC 的代碼了。
這時候執(zhí)行程序,會發(fā)現(xiàn)輸出終端并沒有打印任何東西。因為程序主體本身并沒有調(diào)用 HelloSwift,我們建立的是 OC 工程,所以這時候就需要 OC 來調(diào)用 swift代碼了。
當我們建立 HelloSwift 時,xcode 其實做了一些后臺工作,除了詢問你是否建立 "HelloWorld-Bridging-Header.h" 外,它還隱式的創(chuàng)建了一個叫 "HelloWorld-Swift.h" 的頭文件,記住,這個文件是 xcode 隱式創(chuàng)建的,所以不要自己去建立這個文件,很多人查資料發(fā)現(xiàn)需要這個頭文件沒看仔細就自己去創(chuàng)建,結(jié)果導(dǎo)致各種編譯不通過。
這個 HelloWorld-Swift 文件從文件到代碼都是 xocode 動態(tài)生成的,你不需要編輯它,如果感興趣里面到底寫了什么,你可以通過 import 這個文件,Jump To Definition 的方式一探究竟。
當你需要暴露 swift 的類給 OC 調(diào)用時,你不需要通過任何逐個 import 的方式,你只要 import "HelloWorld-Swift.h" 即可。
嘗試步驟如下:
在 ViewController.m 文件中,引入頭文件 #import "HelloWorld-Swift.h"
在 ViewDidLoad 方法的實現(xiàn)中,調(diào)用 [HelloSwift hello];
這時候編譯,執(zhí)行,工程打印日志輸出為:
Hello, Swift.
Hello, OC.
開發(fā)項目經(jīng)常要引用第三方框架,在 swift 中,引用這些框架是非常簡單的,只要在 HelloWorld-Bridging-Header.h 中用 @import 語句包含該框架即可。不管該框架是用什么 swift 還是 OC 寫的,又或者是混合編寫,用法都一樣。
而如果是用 OC 引用這些框架的話,標準做法應(yīng)該是:
在 .m 文件中,用 @import 語句引用該框架
在 .h 文件中,如果需要在接口中聲明對應(yīng)的類,則應(yīng)該用 @class 做前置聲明,用這樣的做法來規(guī)避循環(huán)引用問題。
舉例 HelloWorld 項目來說,當我們要在 HelloSwift.swift 中引用一個 SwiftFrameWork 框架時,正確的做法是:
在 HelloWorld-Bridging-Header.h 中加入 @import SwiftFrameWork;
在 HelloSwift.swift 中自由調(diào)用 SwiftFrameWork 的類。
而如果要在 HelloOC.h 和 HelloOC.m 中這么做,則標準做法應(yīng)該是:
在 HelloOC.m 中,通過 @import SwiftFrameWork;
在 HelloOC.h 中,如果有需要引用到的 SwiftFrameWork 框架中的類,用前置聲明的方法解決,比如如果需要引用類 ClassA,則可以在引用前聲明 @class ClassA;
如果需要在 HelloOC.h 中引用到 HelloSwift 類,也應(yīng)該遵循步驟 2 的做法。
對于swift 的 protocol,也可以暴露給 OC 調(diào)用,但是需要做一些額外的工作,需要針對要暴露的 swift protocol 添加 @objc 聲明,并且對于 optional 函數(shù)也要追加 @objc @optional
在 HelloSwift.swift 追加協(xié)議代碼:
// 因為這個 protocol 要暴露給 OC 用,所以用 @objc 聲明 @objc protocol HelloProtocol { // 這是一個普通的swift協(xié)議函數(shù) func protocolFunction() // 這是個 optional 函數(shù),需要在前面追加 @objc 聲明 @objc optional func optionalProtocolFunction() }
一旦完成了以上操作,OC類即可聲明和實現(xiàn)對應(yīng)的協(xié)議函數(shù)為其他類提供回調(diào)實現(xiàn)。
swift 和 OC 之間的錯誤碼共享方案很簡單,就是簡單的命名映射技術(shù),在 swift 中定義錯誤碼如下:
@objc public enum CustomError: Int, Error { case a, b, c }
則 xcode 會在 HelloWorld-Swift.h 中聲明對應(yīng)的面向 OC 的錯誤碼:
typedef SWIFT_ENUM(NSInteger, CustomError) { CustomErrorA = 0, CustomErrorB = 1, CustomErrorC = 2, }; static NSString * _Nonnull const CustomErrorDomain = @"HelloWorld.CustomError";
命名映射的規(guī)則比較簡單明了,Enum 類型名不變,實例的名稱通過大駱駝命名法進行拼接。
HelloOC.h
HelloOC.m
HelloSwift.swift
ViewController.m
蘋果為保證 swift 和 OC 順利交互,做了大量嚴謹?shù)墓ぷ?,這里就不一一說明了,畢竟道理大同小異,在需要的時候查閱文檔就可以了,類似需要查閱的知識點有:
用 NS_REFINED_FOR_SWIFT 宏重定義 OC 接口
手動為 swift 類指定一個映射名給 OC 調(diào)用(通過 @objc)
通過 NS_SWIFT_NAME 指定 swift 自定義名稱
...
Using Swift with Cocoa and Objective-C (Swift 4)
author: Madaxin
email: madaxin@outlook.com
qq group: 527628370
home: madaxin.com
網(wǎng)站名稱:Swift4和Objective-C在同一個工程里的
分享網(wǎng)址:http://jinyejixie.com/article14/posige.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站、、全網(wǎng)營銷推廣、網(wǎng)站改版、標簽優(yōu)化、靜態(tài)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)