Avatar
ちょうどぼくも先週、同じようなことを模索してました。
1:23 AM
ObjCとSwift混在のアプリ(App)のうち、一部のSwiftをSwiftPMのパッケージ(Foo)に切り出そうとしてたんですが、切り出すとAppのObjCからFooを呼び出せなくなって。呼び出せないというか、Fooに切り出した分がApp-Swift.hに出てこなくなるからヘッダがなくなってしまって。
1:28 AM
今のところ、Foo側で、手動で swiftc を -emit-objc-header 付きで呼び出してFooの分のヘッダを作成して、そのヘッダを参照できるだけのCモジュールもFoo側に作って、AppではそのCモジュールを参照するようにしたんですが。
1:33 AM
パッケージの構成はこんな感じで ├── Package.swift └── Sources ├── Foo │ ├── Foo1.swift │ ├── Foo2.swift │ └── FooN.swift └── CFoo ├── Foo.m └── include └── Foo-swift.h
1:34 AM
Package.swiftがこんな感じです。 // swift-tools-version:5.0 import PackageDescription let package = Package( name: "Foo", products: [ .library(name: "Foo", targets: ["Foo"]), .library(name: "CFoo", targets: ["CFoo"]) ], targets: [ .target(name: "Foo"), .target(name: "CFoo", dependencies: ["Foo"]) ] ) (edited)
1:36 AM
Foo.mの中身は空っぽで、Foo-Swift.hが -emit-objc-header で作ったヘッダファイル。 App側でCFooを参照すれば、ObjCでも、 @import CFoo; だけでヘッダの参照ができるようになりました。 (edited)
1:40 AM
ただ、Foo側のコードを変更した時に Foo-Swift.h を更新するのがすごく面倒で… 😟