Создание заголовка Objective- C с помощью менеджера пакетов Swift - PullRequest
4 голосов
/ 27 февраля 2020

У меня есть существующая среда Swift, которая импортирована в код Obj C. Я хотел бы переместить его из xcodeproj в менеджер пакетов Swift. До сих пор я не нашел способа сгенерировать заголовок Obj C и импортировать его.

Например, рассмотрим следующий минимальный проект:

$ ls -R
Package.swift Sources

./Sources:
SwiftStuff objc

./Sources/SwiftStuff:
SwiftStuff.swift

./Sources/objc:
main.m

Package.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"]])
    ]
)

SwiftStuff.swift

import Foundation

@objc public class TheObject: NSObject {
    @objc public func dothing() {
        print("DO IT!")
    }
}

main.m

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

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

Я не понял, как сделать компиляцию строки @import SwiftStuff;. Если я создаю заголовок вручную, используя -emit-objc-header, я могу импортировать его с помощью #import "...path_to_header", а затем вручную связать код Obj C с .linkLibrary. Но я не могу найти способ сделать это автоматически, и если я включу -emit-objc-header в Package.swift, никакой другой пакет не может зависеть от этого (так как для него требуется небезопасная настройка).

...