天天看點

如何在Swift Package (SPM) 裡使用ObjC/OC 代碼

背景

最近在開發一個基于Swift的app。對于有些已經在OC實作或者隻能在OC實作的功能,我們盡量想複用OC代碼。這篇文章目的在解決如何在用Swift Package裡調用OC代碼。

Swift Package 有一些預設的路徑。例如include/ Sources/ 等。以下的例子是objc 和 swift 代碼在同一個Swift Package裡 (如果是分開兩個swift package 也是類似的操作)

// Package.Swift 
targets: [
	.target(
	name: "objc",
	dependencies: []
	),
   .target(
   name: "<Your_Swift_Target>",
   dependencies: ["objc"]
   ),
           

首先是Package.swift, 裡面定義了兩個target。一個是objc 一個是swift。swift target 需要依賴objc target。objc target的名字可以是自定義的,但是要跟一下的檔案夾名字保持一緻。

# 檔案結構
- Package.swift
- Sources
  - <Your_Swift_Target>
  - objc
    - include
      - header.h
    - impl.m
           

以上是檔案結構。根目錄下Package.swift, 同目錄下有Sources 檔案夾,裡面有所有的源代碼。第一個子目錄是Swift相關的檔案夾;另外一個是objc,裡面包括了所有的oc 的源代碼。注意,objc下還要有一個include的目錄,裡面放所有exposed 頭檔案。這一步是關鍵。

// Your Swift file
import objc // 導入objc的頭檔案
           

最後在swift檔案裡引用objc 就可以使用objc下所有的頭檔案裡的内容。

親測有效。通過這個方式就可以在swift app裡穿插一些oc的代碼,友善複用。另外,除了引用oc library外,還可以支援oc_executable 和 swift_executable。詳細請參考附帶的連結。

參考

http://ankit.im/swift/2016/05/21/creating-objc-cpp-packages-with-swift-package-manager/