OC工程使用Swift
工程配置
首先準(zhǔn)備好目標(biāo)OC工程找前,將需要集成到OC工程中的Swift文件拖入工程。此處我們用的示例工程名為OCProject缝裁,引入的Swift文件為SwiftClass.swift。若此前未在OC中集成過Swift文件,則新添加Swift時會有如下提示:
該提示建議我們創(chuàng)建一個bridging header橋接文件杆怕。不過該橋接文件的作用是開放OC代碼給Swift調(diào)用,此處并無此需求壳贪,我們要講的是OC調(diào)用Swift陵珍,因此可創(chuàng)可不創(chuàng)。本例在實際操作中選擇了create违施。
工程中添加了Swift文件之后互纯,Xcode會在Build Setting中添加一些相關(guān)的配置項,最主要的是swift-compiler一欄:
Objective-C Bridging Header: 橋接文件路徑磕蒲,對應(yīng)剛才創(chuàng)建的橋接文件留潦,其值在Xcode創(chuàng)建橋接文件時自動填充。若手動創(chuàng)建橋接文件辣往,則需要在該配置項中手動配置橋接文件路徑兔院。
Objective-C Generated Interface Header Name:swift接口頭文件名,其值在引入Swift文件時自動填充站削。
調(diào)用Swift
本例只做最簡單的集成調(diào)用試驗坊萝。
// SwiftClass.swift
import UIKit
@objc class SwiftClass: NSObject {
@objc func callSwift() {
print("swift called by oc");
}
}
swift4開始,繼承自NSObject的類型钻哩,編譯器默認(rèn)不再自動添加@objc標(biāo)記屹堰,因此需要在類的申明前手動添加@objc告知編譯器SwiftClass是一個需要開放給OC的類,并且對于每個需要開放給OC的屬性或者方法街氢,都需要在前面手動添加@objc扯键。也可以使用@objcMembers,用該關(guān)鍵字標(biāo)記的類珊肃,無需再在每個需要開放給OC的屬性或者方法前添加@objc荣刑,編譯器會理解成該類的所有屬性和方法都需要開放馅笙。只在必要的時候使用@objcMembers,因為這會增大最終二進(jìn)制文件的體積厉亏。
OC要調(diào)用時首先需要引入相關(guān)的頭文件董习,但swift是沒有頭文件的,怎么辦呢爱只?其實我們只需要引入 OCProject-Swift.h
頭文件即可皿淋,工程中所有swift開放給OC的接口都會被包含在該頭文件中。但事實上該頭文件不存在于工程中恬试,是Xcode自動生成的窝趣,只要在需要調(diào)用Swift的地方import即可。接著就可以使用Swift中相關(guān)的類了:
// 引入OCProject-Swift.h
#import "OCProject-Swift.h"
// 此處省略執(zhí)行環(huán)境
SwiftClass *swiftObj = [[SwiftClass alloc] init];
[swiftObj callSwift]; // swift called by oc
Swift工程使用OC
文件引入
首先向目標(biāo)Swift工程中引入OC文件训柴,同OC工程引入Swift文件一致哑舒,若工程中不存在橋接文件,Xcode會提示創(chuàng)建幻馁。本例選擇創(chuàng)建bridge文件洗鸵,生成的橋接文件名為 SwiftProject-Bridging-Header
(SwiftProject為工程名)。當(dāng)然也可以手動創(chuàng)建該橋接文件仗嗦,但要手動配置路徑膘滨。
調(diào)用OC
在橋接文件中引入需要調(diào)用的OC頭文件。因為本例導(dǎo)入的OC文件是一個OCClass類儒将,因此在 SwiftProject-Bridging-Header
中引入該頭文件:
#import "OCClass.h"
隨后便可以在Swift中使用該類了:
let ocobj = OCClass()
ocobj.callOC() // oc called by swift