欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

Swift4和Objective-C在同一個(gè)工程里的-創(chuàng)新互聯(lián)

快速起步

你可以在 xcode 里同時(shí)使用 Swift 和 Objective-C(以下簡稱OC)來寫代碼,混搭編程的好處很多,比如允許大量代碼的復(fù)用,在性能和開發(fā)效率之間找到平衡等。

創(chuàng)新互聯(lián)公司是一家專注于成都做網(wǎng)站、網(wǎng)站設(shè)計(jì)、外貿(mào)營銷網(wǎng)站建設(shè)與策劃設(shè)計(jì),旺蒼網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)公司做網(wǎng)站,專注于網(wǎng)站建設(shè)10余年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:旺蒼等地區(qū)。旺蒼做網(wǎng)站價(jià)格咨詢:18980820575

在 Swift 中引用 OC

我們建立一個(gè)工程時(shí),XCode會(huì)詢問我們選擇什么語言進(jìn)行開發(fā),如果你選擇的是OC,那么當(dāng)你第一次新建一個(gè)swift文件時(shí),開發(fā)環(huán)境會(huì)詢問你是否建立一個(gè) .h 文件。這個(gè) .h 文件命名方式是 "#ProjectName#-Bridging-Header.h" 。你可以讓開發(fā)環(huán)境幫你創(chuàng)建這個(gè)文件,也可以自己建,編譯器只認(rèn)這個(gè)文件名,只要?jiǎng)e寫錯(cuò)就好。

我們稱這個(gè)文件叫橋接文件,它的作用是把OC代碼選擇性的暴露給swift,讓swift可以調(diào)用這些接口。

暴露的方式是通過import,也就是說,你可以在這個(gè) .h 文件里 import 任何你想要暴露給swift的代碼,然后就可以在 swift 中訪問了。

動(dòng)手實(shí)踐:

  1. 打開xcode,創(chuàng)建一個(gè)OC工程 HelloWorld

  2. 創(chuàng)建一個(gè)叫 HelloOC 的 OC 類,實(shí)現(xiàn)靜態(tài)方法 hello,實(shí)現(xiàn)代碼 NSLog("hello, OC.")

  3. 創(chuàng)建一個(gè)叫 HelloSwift 的 swift 類,繼承NSObject,實(shí)現(xiàn)靜態(tài)函數(shù) hello(),實(shí)現(xiàn)代碼 NSLog("hello, swift.")

  4. 這時(shí)候 xcode 會(huì)彈出詢問是否創(chuàng)建文件 HelloWorld-Bridging-Header.h ,選擇是,如果你點(diǎn)了否,就自己創(chuàng)建一個(gè)

  5. 在 HelloWorld-Bridging-Header.h 代碼里,加入 #import "HelloOC.h"

  6. 在HelloSwift 的 hello 函數(shù)里,在 NSLog("hello, swift.") 后追加 HelloOC.hello()

注意,繼承自 NSObject 這點(diǎn)很重要,因?yàn)镺C所有類都是繼承自 NSObject,而 swift 沒有這個(gè)要求,所以如果需要暴露 swift 的類給 OC ,一定必須是 NSObject 的子類才行。

如果編譯成功了,那就說明編譯器允許讓你通過 HelloSwift 調(diào)用 HelloOC 的代碼了。

這時(shí)候執(zhí)行程序,會(huì)發(fā)現(xiàn)輸出終端并沒有打印任何東西。因?yàn)槌绦蛑黧w本身并沒有調(diào)用 HelloSwift,我們建立的是 OC 工程,所以這時(shí)候就需要 OC 來調(diào)用 swift代碼了。

在 OC 中引用 swift

當(dāng)我們建立 HelloSwift 時(shí),xcode 其實(shí)做了一些后臺(tái)工作,除了詢問你是否建立 "HelloWorld-Bridging-Header.h" 外,它還隱式的創(chuàng)建了一個(gè)叫 "HelloWorld-Swift.h" 的頭文件,記住,這個(gè)文件是 xcode 隱式創(chuàng)建的,所以不要自己去建立這個(gè)文件,很多人查資料發(fā)現(xiàn)需要這個(gè)頭文件沒看仔細(xì)就自己去創(chuàng)建,結(jié)果導(dǎo)致各種編譯不通過。

這個(gè) HelloWorld-Swift 文件從文件到代碼都是 xocode 動(dòng)態(tài)生成的,你不需要編輯它,如果感興趣里面到底寫了什么,你可以通過 import 這個(gè)文件,Jump To Definition 的方式一探究竟。

當(dāng)你需要暴露 swift 的類給 OC 調(diào)用時(shí),你不需要通過任何逐個(gè) import 的方式,你只要 import "HelloWorld-Swift.h" 即可。

嘗試步驟如下:

  1. 在 ViewController.m 文件中,引入頭文件 #import "HelloWorld-Swift.h"

  2. 在 ViewDidLoad 方法的實(shí)現(xiàn)中,調(diào)用 [HelloSwift hello];

這時(shí)候編譯,執(zhí)行,工程打印日志輸出為:

Hello, Swift.
Hello, OC.

框架(framework)的引用

開發(fā)項(xiàng)目經(jīng)常要引用第三方框架,在 swift 中,引用這些框架是非常簡單的,只要在 HelloWorld-Bridging-Header.h 中用 @import 語句包含該框架即可。不管該框架是用什么 swift 還是 OC 寫的,又或者是混合編寫,用法都一樣。

而如果是用 OC 引用這些框架的話,標(biāo)準(zhǔn)做法應(yīng)該是:

  1. 在 .m 文件中,用 @import 語句引用該框架

  2. 在 .h 文件中,如果需要在接口中聲明對(duì)應(yīng)的類,則應(yīng)該用 @class 做前置聲明,用這樣的做法來規(guī)避循環(huán)引用問題。

舉例 HelloWorld 項(xiàng)目來說,當(dāng)我們要在 HelloSwift.swift 中引用一個(gè) SwiftFrameWork 框架時(shí),正確的做法是:

  1. 在 HelloWorld-Bridging-Header.h 中加入 @import SwiftFrameWork;

  2. 在 HelloSwift.swift 中自由調(diào)用 SwiftFrameWork 的類。

而如果要在 HelloOC.h 和 HelloOC.m 中這么做,則標(biāo)準(zhǔn)做法應(yīng)該是:

  1. 在 HelloOC.m 中,通過 @import SwiftFrameWork;

  2. 在 HelloOC.h 中,如果有需要引用到的 SwiftFrameWork 框架中的類,用前置聲明的方法解決,比如如果需要引用類 ClassA,則可以在引用前聲明 @class ClassA;

  3. 如果需要在 HelloOC.h 中引用到 HelloSwift 類,也應(yīng)該遵循步驟 2 的做法。

protocol (協(xié)議)

對(duì)于swift 的 protocol,也可以暴露給 OC 調(diào)用,但是需要做一些額外的工作,需要針對(duì)要暴露的 swift protocol 添加 @objc 聲明,并且對(duì)于 optional 函數(shù)也要追加 @objc @optional

在 HelloSwift.swift 追加協(xié)議代碼:

// 因?yàn)檫@個(gè) protocol 要暴露給 OC 用,所以用 @objc 聲明
@objc protocol HelloProtocol {
    // 這是一個(gè)普通的swift協(xié)議函數(shù)
    func protocolFunction()
    // 這是個(gè) optional 函數(shù),需要在前面追加 @objc 聲明
    @objc optional func optionalProtocolFunction()
}

一旦完成了以上操作,OC類即可聲明和實(shí)現(xiàn)對(duì)應(yīng)的協(xié)議函數(shù)為其他類提供回調(diào)實(shí)現(xiàn)。

錯(cuò)誤碼

swift 和 OC 之間的錯(cuò)誤碼共享方案很簡單,就是簡單的命名映射技術(shù),在 swift 中定義錯(cuò)誤碼如下:

@objc public enum CustomError: Int, Error {
    case a, b, c
}

則 xcode 會(huì)在 HelloWorld-Swift.h 中聲明對(duì)應(yīng)的面向 OC 的錯(cuò)誤碼:

typedef SWIFT_ENUM(NSInteger, CustomError) {
    CustomErrorA = 0,
    CustomErrorB = 1,
    CustomErrorC = 2,
};
static NSString * _Nonnull const CustomErrorDomain = @"HelloWorld.CustomError";

命名映射的規(guī)則比較簡單明了,Enum 類型名不變,實(shí)例的名稱通過大駱駝命名法進(jìn)行拼接。

范例代碼下載

HelloOC.h
HelloOC.m
HelloSwift.swift
ViewController.m

其它

蘋果為保證 swift 和 OC 順利交互,做了大量嚴(yán)謹(jǐn)?shù)墓ぷ?,這里就不一一說明了,畢竟道理大同小異,在需要的時(shí)候查閱文檔就可以了,類似需要查閱的知識(shí)點(diǎn)有:

  • 用 NS_REFINED_FOR_SWIFT 宏重定義 OC 接口

  • 手動(dòng)為 swift 類指定一個(gè)映射名給 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ù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

本文標(biāo)題:Swift4和Objective-C在同一個(gè)工程里的-創(chuàng)新互聯(lián)
地址分享:http://chinadenli.net/article44/jgjee.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營銷推廣、網(wǎng)站收錄手機(jī)網(wǎng)站建設(shè)、微信公眾號(hào)外貿(mào)建站、App設(shè)計(jì)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作
日本熟女中文字幕一区| 我的性感妹妹在线观看| 日本人妻精品中文字幕不卡乱码 | 国产精品免费福利在线| 日韩在线中文字幕不卡| 日韩一级毛一欧美一级乱| 国产精品日韩精品最新| 国产精品免费视频久久| 成年女人午夜在线视频| av在线免费观看在线免费观看| 精品国产av一区二区三区不卡蜜 | 天海翼精品久久中文字幕| 亚洲中文字幕视频一区二区| 国产日韩精品欧美综合区| 亚洲天堂精品1024| 中字幕一区二区三区久久蜜桃| 国产麻豆成人精品区在线观看| 国内精品一区二区欧美| 香蕉尹人视频在线精品| 午夜免费精品视频在线看| 欧美一区二区三区喷汁尤物| 国产精品一区二区三区黄色片| 免费久久一级欧美特大黄孕妇| 隔壁的日本人妻中文字幕版| 高清不卡视频在线观看| 精品伊人久久大香线蕉综合| 日韩成人午夜福利免费视频| 日本最新不卡免费一区二区| 国产精品欧美在线观看| 国产精品推荐在线一区| 国产在线日韩精品欧美| 精品亚洲一区二区三区w竹菊| 色婷婷久久五月中文字幕| 国产不卡在线免费观看视频| 美国欧洲日本韩国二本道| 日韩一级欧美一级久久| 精品女同在线一区二区| 日韩精品一区二区三区四区| 国产精品国产亚洲看不卡| 久热人妻中文字幕一区二区| 日韩三极片在线免费播放|