I have a Swift package, and try to add Objective-c files.
My package now:
Root
- Package.swift
+ Sources
+ ObjC
+ DataDeflate
- DataDeflate.h
- module.modulemap
- NSData+Deflate.h
- NSData+Deflate.m
+ Swift
+ DataDeflator
- DataDeflatow.swift
+ Tests
+ DataDeflatorTests
- DataDeflatorTests.swift
Package.swift content:
import PackageDescription
let package = Package(
name: "DataDeflator",
products: [
.library(name: "DataDeflator", targets: ["DataDeflator"]),
],
targets: [
.target(
name: "DataDeflator",
dependencies: ["DataDeflate"],
path: "Sources/Swift/DataDeflator"),
.systemLibrary(name: "DataDeflate", path: "Sources/ObjC/DataDeflate"),
.testTarget(
name: "DataDeflatorTests",
dependencies: ["DataDeflator"]),
]
)
module.modulemap content:
module DataDeflate [system] {
header "DataDeflate.h"
link "DataDeflate"
export *
}
DataDeflate.h content:
#ifndef DataDeflate_h
#define DataDeflate_h
#import "NSData+Deflate.h"
#endif /* DataDeflate_h */
Now, using these settings (module.modulemap and targets in Package.swift), Swift code has access to Objective-C NSData category.
But only for declaration (NSData+Deflate.h), and not to implementation (NSData+Deflate.m)!
When I add Objective-C method calling, it builds successfully, without any warnings. But unrecognized selector sent to instance error appears when unit tests runs.
What did I forget? How can I connect both declaration and implementation from Objective-C to Swift?
You don't need to use
systemLibrarytarget with amodulemapfile for your own ObjC source files because usually it's used as wrapper to available C system libraries such assqlite3,curletc. and themodulemapfile can be created for your target automatically by XCode.So you can use simple
target:Next you should organise your files inside DataDeflate folder next way:
Where
includesubfolder must contain<YourTargetName>.h(DataDeflate.h) file and all other public headers to include.