У меня есть существующая среда 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, никакой другой пакет не может зависеть от этого (так как для него требуется небезопасная настройка).