我有一个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.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
含量:
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.modulemap
和Package.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)文件和所有其他公共头文件。