OC 導入或生成Swift 文件時
Xcode會自動為Project生成頭文件以便在Objective-C中調用。
在Objective-C類中調用Swift犬第,只需要#import "productModuleName-Swift.h"即可調用阴颖,Xcode提供的頭文件以Swift代碼的模塊名加上-Swift.h為命名柴灯。
在這個頭文件中谜疤,將包含Swift提供給Objective-C的所有接口选脊、Appdelegate及自動生成的一些宏定義澎怒,如圖1-5所示褒搔。注意productModuleName-Swift.h在Xcode中是無法搜索查看的,只能從import中點擊進去查看喷面。
關于Xcode相關的配置, 不醉就不多說了, 百度一下一大把, 主要闡述一下不醉混合開發(fā)期間遇到的問題:
1> swift API 在OC中調用死活調不到(氣煞老夫也)
? ? 稍微了解swift的乖乖們都知道, 她有很多特性是OC理解不了的, 例如元組, 還有天殺的可以直接加函數(shù)甚至元組的枚舉. 系統(tǒng)自動生成的-Swift.h一下就懵逼了, 牛頭不對馬嘴,?從import中點擊進去查看, 什么枚舉屬性, func函數(shù) 就算是public open也完全找不到, 壓根給你忽略了!怎么辦?怎么辦?不要怕, 問題就是給人解決的, 不然它的存在就毫無意義
舉個栗子:
不醉最近在研究高大上的ARKit, 奈何坑爹的官方給的demo都是Swift, 不醉不是沒用過Swift, 奈何很早之前了, 近兩年基本就著女王(女盆友, 哈哈)的美味吃到肚子里了,好吧! 是都忘光了!忘了怎么辦? 去學!當然要學, BUT, 老板不給你那么多時間啊, 我們的項目要用OC開發(fā)的 ,官方的代碼全部翻譯成OC不太現(xiàn)實, 時間, 對, 沒時間!那么問題的關鍵來了, 怎么辦?機智的乖乖們可能想到了-Swift.h理解不了的東西我們換個她能理解的方式給她實現(xiàn), 這么多廢話, 看代碼:
func worldPosition(fromScreenPosition position: CGPoint, objectPosition: float3?, infinitePlane: Bool = false) -> (position: float3, planeAnchor: ARPlaneAnchor?, isOnPlane: Bool)? {
????這里的代碼就像她肚子里的蟲, 乖乖們多少還是要能看懂點的!
}
(fromScreenPosition position: CGPoint, objectPosition: float3?, infinitePlane: Bool = false)這是讓你傳入個元組;
(position: float3, planeAnchor: ARPlaneAnchor?, isOnPlane: Bool)這是給你return個元組;
奈何OC讀不懂這個, 那么問題來了, OC能讀懂什么, 此處又要啰嗦了:
繼承自NSObject的對象類如:ARPlaneAnchor, 兩者都有的CGPoint及基礎數(shù)據(jù)類型等等,?float3她不懂, 那么組成float3的Float她是可以懂的, 要怎么做呢?堆料!就是在Swift文件里重寫函數(shù),直接上代碼:
func worldPosition0(fromScreenPosition position:CGPoint) -> (ARPlaneAnchor?) {
? ? 這里邊你就依葫蘆畫瓢嘛! 傳入的點position有了,返回的ARPlaneAnchor有了! 不能用元組, 你就傳不了多個參數(shù)(其實是不醉不知道, 有知道的可以賜教), 剩下的objectPosition: float3?, infinitePlane: Bool = false,position: float3,isOnPlane: Bool 怎么辦? 想不到了吧, 你一定想不到不醉會用這么笨的方法:定義屬性!!!
var objectPositionX: Float = 0
var objectPositionY: Float = 0
var objectPositionZ: Float = 0
//這三個是拆分的objectPosition: float3,跟position: float3同用一組就行了, 我就是用來傳值;?在OC中調用你自定義的下邊的方法之前初始化對象給它們賦值
var objectPosition: float3?
if objectPositionY != 0 && objectPositionX != 0 && objectPositionZ != 0 {
objectPosition = float3(x: self.objectPositionX, y: self.objectPositionY, z: self.objectPositionZ)
}//寫在這個函數(shù)里, 這樣就得到了Swift想要的float3
var infinitePlane: Bool = false//也在OC中調用你自定義的下邊的方法之前初始化對象給它賦值
var isOnPlane: Bool = false//在return之前給它賦值, 你就可以在OC里獲取到她想要的isOnPlane的值
以上定義的屬性不是放在這里, 放在你Swift文件她定義其他屬性的地方就OK??
畫完這個函數(shù)預編譯一下,?從import中點擊進去-Swift.h查看, 沒意外!就是它:
????????- (ARPlaneAnchor * _Nullable)worldPosition0From:(CGPoint)position ????????????????????SWIFT_WARN_UNUSED_RESULT;//
}
那么OC文件里的代碼就是:
需要的屬性賦值和
你想要的ARPlaneAnchor = [self.SceneView worldPosition0From:screenCenter];
以及position: float3(此處用那組三個屬性自己拼好就行了)
感覺有點繞, 廢話太多!有什么不懂得可以直接問, 未能及時回復的還請見諒!
未完待續(xù)! 記得點贊哦!