首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Objective-C 與 Swift 混編完整指南:環境配置、常見坑與最佳實踐

     編輯:關於C語言

為何混編?

  • Swift 排名上升,OC 下降,技術棧演進必然。
  • 既有 OC 模組重寫成本高,第三方庫多為 OC。
  • 混編是資源、管理、趨勢綜合考量下的理性選擇。

環境配置四步驟

  1. 建立專案,Language 選 Swift 或 OC 均可。
  2. 新增 Swift 檔,Xcode 自動提示建立 Bridging-Header.h,選 Yes。
  3. 設定 Objective-C Bridging Header 路徑(專案 Target → Build Settings → Swift Compiler - General)。
  4. 設定 Objective-C Generated Interface Header Name(即 ProductModuleName-Swift.h)。

Bridging Header 設定 Generated Header 設定

雙向互調機制

方向操作
Swift → OC在 Bridging-Header.h 中 #import "OCClass.h"
OC → Swift在 OC 檔中 #import "ProductModuleName-Swift.h"

ProductModuleName-Swift.h 由 Xcode 自動生成,包含所有 @objc 標記的 Swift 類/成員介面。

常見坑與解決方案

1. OC 複雜巨集

Swift 無預處理器,建議改為 static inline 函式或 const 變數。

2. OC 巨集與 Swift 類同名衝突

例:#define MView @\"MView\" 與 Swift `class MView` 同名。
解決:重命名巨集或 Swift 類,避免在 #import "ProductModuleName-Swift.h" 後產生重複定義錯誤。

3. Swift 使用 OC 枚舉

  • 單純取值:直接用 EnumType.value。
  • 參與運算:需 .rawValue 或 .value(視定義)。

4. OC 使用 Swift 枚舉

  • Swift 枚舉前加 @objc。
  • 原始值型別必須為 Int。

5. @objc / dynamic / NSObject 繼承

  • Swift 類需在 OC 可見 → 繼承 NSObject 或標記 @objc。
  • 成員需在 OC 可見 → 標記 @objc。
  • 支援 KVC/KVO → 標記 dynamic。

6. IBOutletCollection 替代

@IBOutlet var labels: [UILabel]!   // Swift 陣列替代 IBOutletCollection

注意:連接順序不保證為視覺順序。

7. 循環引用(重複匯入)

OC 檔需 #import "ProductModuleName-Swift.h",而 Bridging Header 已 #import 該 OC 檔。
解決:在 OC .m 實作檔 中匯入 Swift 標頭,並將公開屬性型別改為 id,使用時再強轉:

// ViewController.h
@property (nonatomic, strong) id mData;   // 不用 MData*

// ViewController.m
#import "ProductModuleName-Swift.h"
- (void)useData {
    if ([self.mData isKindOfClass:[MData class]]) {
        MData *data = (MData *)self.mData;
    }
}

Swift 2/3 遷移提醒

  • var → let(不可變優先)。
  • println → print。
  • do-while → repeat-while。
  • 面向協議程式設計(Protocol-Oriented Programming)成為主流。

框架級混編架構

將 OC 與 Swift 代碼分別封裝為獨立 Framework,再由主專案引用,隔離編譯依賴,加速增量建構。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved