我通过模块映射文件将 Objective-C 文件添加到 Swift 包中,但实现未连接



我有一个Swift包,并尝试添加Objective-c文件。

我现在的包:

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.swiftcontent:

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含量:

module DataDeflate [system] {
header "DataDeflate.h"
link "DataDeflate"
export *
}

DataDeflate.h含量:

#ifndef DataDeflate_h
#define DataDeflate_h
#import "NSData+Deflate.h"
#endif /* DataDeflate_h */

现在,使用这些设置(module.modulemapPackage.swift中的目标),Swift代码可以访问Objective-C NSData类别。但只适用于声明(NSData+Deflate.h),而不是实现(NSData+Deflate.m)!

当我添加Objective-C方法调用时,它成功构建,没有任何警告。但是运行单元测试时出现unrecognized selector sent to instance错误

我忘了什么?我如何将声明和实现从Objective-C连接到Swift?

你不需要为你自己的ObjC源文件使用systemLibrary目标和modulemap文件,因为通常它被用作可用的C系统库的包装,如sqlite3,curl等,modulemap文件可以由XCode自动为你的目标创建。

所以你可以使用简单的target:

...
targets: [
...
.target(name: "DataDeflate", path: "Sources/ObjC/DataDeflate"),
]
...

下一步,你应该组织你的文件在DataDeflate文件夹下:

- Package.swift
+ Sources
+ ObjC
+ DataDeflate
+ include
- DataDeflate.h
- NSData+Deflate.h
- NSData+Deflate.m
...

include子文件夹必须包含<YourTargetName>.h(datadeflat .h)文件和所有其他公共头文件。

最新更新