Swift 和 Object-C 混編
添加橋接文件败富, {product-module-name}-Bridging-Header.h 文件撼嗓, 在這個(gè)文件中,添加Swift中需要調(diào)用的 OC 類的頭文件
@import YYModel
混編的問題,OC 是基于運(yùn)行時(shí),遵循了 KVC 和動(dòng)態(tài)派發(fā)趾诗,而 Swift 為了追求性能,在編譯時(shí)就已經(jīng)確定鸿竖,而不需要在運(yùn)行時(shí)的沧竟,在 Swift 類型文件中,為了解決這個(gè)問題缚忧,需要暴露給 OC 使用的任何地方(類悟泵,屬性,方法等)的生命前面加上 @objc 修飾符
如果用 Swift 寫的 class 是繼承 NSObject 的話闪水, Swift 會(huì)默認(rèn)自動(dòng)為所有非 private 的類和成員加上@objc
@objc 修飾符的另一個(gè)作用是為 Object-C 側(cè)重新生命方法或者變量的名字糕非。
@objc(MyClass)
class 我的類: NSObject {
func 打招呼(名字: String) {
print("哈嘍:\(名字)")
}
}
我的類().打招呼(名字: "小明")
// 上面的 非 ASCII 編碼問題
// OC 的話是無(wú)法使用中文進(jìn)行調(diào)用的,因此我們必須使用 @objc 將其轉(zhuǎn)換為 ASCII 才能在 OC 中訪問
// 在類的上面 加入 @objc(MyClass)球榆, 這樣 OC 中調(diào)用用 [MyClass new] greeting:@"XiaoMing"]
/*
需要注意的是朽肥, 添加 @objc 修飾符并不以為這這個(gè)方法或者屬性會(huì)變成動(dòng)態(tài)派發(fā),Swift 依然可能會(huì)將其優(yōu)化為靜態(tài)調(diào)用持钉。如果你需要和 OC 里動(dòng)態(tài)調(diào)用相同的運(yùn)行特性的話衡招,你需要使用的修飾符是 dynamic。 一般情況下做 app 開發(fā)時(shí)應(yīng)該用不上每强,但是在實(shí)戰(zhàn)一些像動(dòng)態(tài)替換方法或者運(yùn)行時(shí)再?zèng)Q定實(shí)現(xiàn)這樣的'黑魔法'的時(shí)候始腾,我們就需要用到 dynamic 修飾符了。
現(xiàn)在 OC 中的SDK庫(kù)已經(jīng)添加了 nonnull 和 nullable 已經(jīng)泛型的數(shù)組和字典空执,其實(shí)都是為了使 SDK 更加適合用 Swift 來(lái)使用所做的努力浪箭。
*/