I have a mixed Swift and Objective-C app wich is build on mixed Swift and Objective-C frameworks. I'd like to convert the frameworks now step by step to Swift Packages.
My current problem looks like this:
Let's say I have a Swift Package called AppCore with a Swift and an Objective-C target building a library product. The AppCore target contains Swift code and the AppCoreObjC target contains Objective-C code.
let package = Package(
name: "AppCore",
products: [
.library(
name: "AppCore",
targets: ["AppCore"]),
],
dependencies: [
],
targets: [
.target(
name: "AppCoreObjC",
dependencies: []),
.target(
name: "AppCore",
dependencies: ["AppCoreObjC"]),
.testTarget(
name: "AppCoreTests",
dependencies: ["AppCore"]),
.testTarget(
name: "AppCoreObjCTests",
dependencies: ["AppCore"]),
]
)
Let's say under the AppCore target I have a Swift class:
public class Foo {
}
And under the AppCoreObjC target I have an Objective-C class:
@interface Bar
@end
In my app I'd now like to have Swift code using the Swift and Objective-C part of AppCore like this:
import AppCore // <---
class MyAppCorePackageUser {
func example () {
let f = Foo()
let b = Bar()
}
}
and the same for the Objective-C code of the app, like this:
@import AppCore; // <---
@interface MyAppCorePackageUser: NSObject
@end
@implementation MyAppCorePackageUser
- (void) example {
Foo* foo = [[Foo alloc] init];
Bar* bar = [[Bar alloc] init];
}
@end
The important point: For the user of AppCore there should be just one module name and therefor one import AppCore statement and now need to also import AppCoreObjC!
For the Swift part of the AppCore package I can make this possible by adding a file e.g. AppCore.swift holding this line:
@_exported import AppCoreObjC
Therefor the Swift part of my app works liked outlined above.
However, I didn't find a way to make the same thing work under Objective-C. So instead of the ideal code above the actual Objective-C code looks like this:
@import AppCore;
@import AppCoreObjC; // <---
@interface MyAppCorePackageUser: NSObject
@end
@implementation MyAppCorePackageUser
- (void) test {
Foo* foo = [[Foo alloc] init];
Bar* bar = [[Bar alloc] init];
}
@end
I need to add an extra @import AppCoreObjC; statement to make Bar available and the code compile.
My question: Is there a way to have a mixed Swift and Objective-C Swift Package AppCore making it's whole mixed API available under one module name: import AppCore (Swift world) or @import AppCore; (Objective-C world)? Can you point me to any sample code?