背景
最近在開發一個基于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/