Obj-C混編Swift && Swift混編Obj-C
Swift引用OC實(shí)現(xiàn)通過橋接頭文件,OC引用Swift實(shí)現(xiàn)直接importProductModuleName-Swift.h
OC引用Swift或者Swift引用OC都需要將Defines Module選項(xiàng)設(shè)為YES
TARGETS ->Build Settings -> Packaging 中 設(shè)置Defines Module為YES
第一次在Swift創(chuàng)建OC文件,或者第一次OC創(chuàng)建Swift時(shí),xcode會(huì)提示橋接,Creat Bridging Header即可,這個(gè)文件用于Swift調(diào)用OC文件,與OC調(diào)用Swift無關(guān)。
手動(dòng)創(chuàng)建橋接文件
首先介紹下這兩個(gè)選項(xiàng)
product module name 產(chǎn)品模塊名稱
product name 產(chǎn)品名稱 Swift中的命名空間
路徑
Target->Build Settings->all->packaging
在默認(rèn)情況下,product module name和工程的Product Name一樣。
在OC中引入Swift或Swift中引入OC會(huì)自動(dòng)生成ProductModuleName-Bridging-Header.h的頭文件用于Swift訪問OC文件
如果修改的話切記要修改product name的話也要修改info.plist路徑Info.plist.File 命名空間要與其一致
在Obj-C中混編Swift
- Defines Module 設(shè)置為YES
- OC引用Swift Xcode自動(dòng)式實(shí)現(xiàn)的橋接文件命名方式是ProductModuleName-Swift.h
- 直接在OC項(xiàng)目中,import ProductModuleName-Swift.h即可
- 如果單純OC調(diào)用Swift以上即可,不需要倒入什么橋接文件。
在Swift中混編Obj-C
- Defines Module 設(shè)置為YES
- Xcode在Swift中新建OC會(huì)生成ProductModuleName-Bridging-Header.h
//File > New > File > iOS > Source > Header File - 在ProductModuleName-Bridging-Header.h橋接文件中,直接import需要引用的OC文件即可。
說到product Name 這里說一下命名空間
OC中沒有命名空間這一說,都是使用類前綴(Class Prefix),當(dāng)作命名空間用區(qū)分名稱相同的文件,蘋果規(guī)定,兩字前綴蘋果擁有所有權(quán),三個(gè)字母的前綴為開發(fā)者使用。但是不沖突就沒事。例如AFNetWorking NSString MBProgressHUD ···
Swift中終于添加了命名空間,在任意類中打印一下self 會(huì)出現(xiàn)"命名空間.className"
注意。swift中的命名空間的使用不是一個(gè)項(xiàng)目,而是需要跨項(xiàng)目,在一個(gè)項(xiàng)目中,都是一個(gè)命名空間,在同一個(gè)命名空間下,所有全局變量或者函數(shù)共享,不需要import,從swift開始,官方更多的建議大家使用pod來管理第三方框架,不然倒入一個(gè)框架到處都可以用
swift獲取product Name
根據(jù)類名轉(zhuǎn)換成類的時(shí)候需要用到 product name + . + classStringName 也就是命名空間。
在這里需要說一下,OC Swift的命名空間的問題,別的語(yǔ)言都有命名空間這個(gè)概念唯獨(dú),OC Swift只有一個(gè)命名空間,就是它的Product Name
//這個(gè)key 在info.plist中source code打開即可看到。
//獲取命名空間
guard let nameSpace = Bundle.main.infoDictionary!["CFBundleExecutable"] else {
print("獲取命名空間
return
}
//根據(jù)類字符串轉(zhuǎn)換
guard let VcClass = NSClassFromString("\(nameSpace).\(vcName)") else {
print("轉(zhuǎn)換失敗")
return
}
//類型轉(zhuǎn)換
guard let viewController = VcClass as? UIViewController.Type else {
print("類型轉(zhuǎn)換失敗")
return
}
也可以創(chuàng)建一個(gè)Bundle的extension
extension Bundle {
//使用計(jì)算屬性
var spaceName: String {
// return Bundle.main.infoDictionary?["CFBundleExecutable"] as? String ?? ""
return infoDictionary?["CFBundleExecutable"] as? String ?? ""
}
}
/**
guard let nameSpace = Bundle.main.infoDictionary!["CFBundleExecutable"] else {
print("獲取命名空間
return
}
*/
//上邊的獲取命名空間就可以寫成這個(gè)
guard let spaceNamee = Bundle.main.spaceName else {
print("獲取失敗")
}