我有一個 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內容:
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?
uj5u.com熱心網友回復:
您不需要將systemLibrarytarget 與modulemap您自己的 ObjC 源檔案的檔案一起使用,因為它通常用作可用 C 系統庫(例如等)的包裝器sqlite3,并且可以由 XCode 自動為您的目標創建檔案。curlmodulemap
所以你可以使用簡單的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(DataDeflate.h) 檔案和所有其他要包含的公共標頭。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/496057.html
上一篇:IOS段與段之間的距離
