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

Swift 與 Objective-C 混合專案完整互操作指南

     編輯:C 語言入門

Xcode 專案中 Swift/ObjC 雙向呼叫:模組、存取控制、標頭檔、@objc

建立混合語言專案的完整步驟,涵蓋 Bridging Header、Generated Header、存取控制映射、私有類型可見性、原始碼查看與常見坑點。

專案建立步驟

  1. 建立 ObjC 專案 (或 Swift 專案加 ObjC 檔)
  2. 新增 Swift 檔 → Xcode 提示建立 ProductModuleName-Bridging-Header.h → 選擇建立
  3. 新增 ObjC 檔 → Xcode 提示建立 Bridging Header (若不存在) → 選擇建立
  4. 專案設定 → Swift Compiler - General → Objective-C Bridging Header 確認路徑正確
  5. Build Settings → Defines Module = YES (模組化必要)

Swift → ObjC 可見性規則

Swift 宣告ObjC 可見Generated Header 中條件
@objc public class✅✅模組公開 + @objc
@objc class (internal)✅✅同模組內預設 internal 也會匯出
@objc private class❌❌private 限定檔案內
public class (無 @objc)❌❌無 @objc 不匯出 ObjC
class (internal, 無 @objc)❌❌同上
private class (無 @objc)❌❌檔案私有

關鍵規則

  • @objc 是橋樑:只有標記 @objc 的類別/方法/屬性才會匯出到 ObjC
  • 繼承 NSObject:@objc 類別必須繼承 NSObject (或其子類)
  • internal = 模組內公開:同一 Target 內的 Swift 檔互相可見,且會匯出到 ObjC (若有 @objc)
  • 跨檔案 private 不可見:Swift private 限定「同一檔案」,不同於 ObjC 的類別私有

ObjC → Swift 使用流程

// 1. Bridging Header 中匯入 ObjC 標頭
#import "MyObjCClass.h"

// 2. Swift 中直接使用 (自動轉換)
let obj = MyObjCClass()
obj.property = 42
obj.methodWithArg(10, completion: { result in ... })

// 3. 對應規則
// ObjC: - (instancetype)initWithName:(NSString *)name age:(NSInteger)age;
// Swift: init(name: String, age: Int)
// ObjC: @property (nonatomic, copy) NSString *name;
// Swift: var name: String
// ObjC: id _Nullable / _Nonnull → Swift: Optional / Non-optional

Generated Header 內容解析

ProductModuleName-Swift.h 由 Xcode 自動生成,包含:

  • 所有 @objc public / @objc internal 類別介面
  • 方法簽名轉換 (Selector → Swift 方法名)
  • 屬性對應
  • 名稱修飾:_TtC (編碼模組+類別名)

常見坑點與解決

問題原因解決
找不到 Swift 類別未加 @objc 或非 NSObject 子類加 @objc、繼承 NSObject
Bridging Header 匯入失敗路徑錯誤、Target Membership 未勾選檢查 Build Settings 路徑、檔案 Target 勾選
Swift 無法存取 ObjC 類別未在 Bridging Header 匯入在 .h 中 #import
循環匯入Swift 匯入 ObjC,ObjC 又匯入 Swift Header前向宣告 @class、移除不必要匯入
私有 Swift 類別在 ObjC 可見誤以為 private 等同 ObjC 私有Swift private = 檔案私有,用 fileprivate (同模組) 或移除 @objc

進階:Swift Package / Framework 中的公開性

  • public:模組外可見,但 不可繼承/覆寫 (除非 open)
  • open:模組外可見、可繼承、可覆寫
  • @objc public → ObjC 看到 public 類別
  • Framework 專案需 Build Libraries for Distribution = YES 穩定 ABI

原始碼查看技巧

  • Cmd+Click 類別名 → 跳轉到 Generated Header
  • Ctrl+Cmd+Up/Down → .h/.m/.swift 快速切換
  • Product → Perform Action → Preprocess 查看展開後原始碼
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved