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?