使用 Swift Package Manager 生成 Objective-C 头文件

Rob*_*ier 12 objective-c swift swift-package-manager

我有一个导入到 ObjC 代码中的现有 Swift 框架。我想将它从 xcodeproj 移动到 Swift Package Manager。到目前为止,我还没有找到生成 ObjC 标头并导入它的方法。

例如,考虑以下最小项目:

$ ls -R
Package.swift Sources

./Sources:
SwiftStuff objc

./Sources/SwiftStuff:
SwiftStuff.swift

./Sources/objc:
main.m
Run Code Online (Sandbox Code Playgroud)

包.swift

// swift-tools-version:5.1
import PackageDescription

let package = Package(
    name: "ObjCStuff",
    products: [
        .executable(name: "objc", targets: ["objc"]),
        .library(name: "SwiftStuff", targets: ["SwiftStuff"]),
    ],
    targets: [
        .target(name: "SwiftStuff"),
        .target(name: "objc", dependencies: ["SwiftStuff"]])
    ]
)
Run Code Online (Sandbox Code Playgroud)

SwiftStuff.swift

import Foundation

@objc public class TheObject: NSObject {
    @objc public func dothing() {
        print("DO IT!")
    }
}
Run Code Online (Sandbox Code Playgroud)

主文件

#import <Foundation/Foundation.h>
@import SwiftStuff;

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        [[TheObject new] dothing];
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我还没有弄清楚如何使该@import SwiftStuff;行编译。如果我使用 手动构建标头-emit-objc-header,则可以使用 导入它#import "...path_to_header",然后手动将 ObjC 代码与.linkLibrary. 但是我找不到一种方法来自动完成这项工作,如果我包含-emit-objc-header在 Package.swift 中,则没有其他包可以依赖于这个包(因为它需要一个不安全的设置)。