【发布时间】:2021-01-30 10:07:40
【问题描述】:
我正在尝试编写一个使用 CoreML 模型的 Swift 包。 我对 Swift 包的创建不是很熟悉,我无法让它工作。 以下是我根据迄今为止阅读的不同帖子所做的:
- 创建一个空包
$ mkdir MyPackage
$ cd MyPackage
$ swift package init
$ swift build
$ swift test
-
用 XCode 打开
Package.swift文件 -
将
MyModel.mlmodel文件拖放到Sources/MyPackage文件夹中
当我在 XCode 中单击 MyModel.mlmodel 文件时,我在类名下显示以下消息:
Model is not part of any target. Add the model to a target to enable generation of the model class.
同样,如果我在终端中使用命令 swift build,我会收到以下消息:
warning: found 1 file(s) which are unhandled; explicitly declare them as resources or exclude from the target
/Path/To/MyPackage/Sources/MyPackage/MyModel.mlmodel
- 为了解决这个问题,我在
Package.swift文件中的目标资源中添加了MyModel:
.target(
name: "MyPackage",
dependencies: [],
resources: [.process("MyModel.mlmodel")]),
如果我现在使用命令 $ swift build,我将不再收到警告,并收到消息:
[3/3] Merging module MyPackage
但是当我在 XCode 中检查 MyModel.mlmodel 文件时,我在类名下显示以下消息:
Model class has not been generated yet.
- 为了解决这个问题,我在终端中使用了以下命令:
$ cd Sources/MyPackage
$ xcrun coremlcompiler generate MyModel.mlmodel --language Swift .
这会在 mlmodel 文件旁边生成一个 MyModel.swift 文件。
- 我将模型插入代码
MyPackage.swift:
import CoreML
@available(iOS 12.0, *)
struct MyPackage {
var model = try! MyModel(configuration: MLModelConfiguration())
}
- 最后,在测试文件
MyPackageTests.swift中,我创建了一个MyPackage的实例:
import XCTest
@testable import MyPackage
final class MyPackageTests: XCTestCase {
func testExample() {
if #available(iOS 12.0, *) {
let foo = MyPackage()
} else {
// Fallback on earlier versions
}
}
static var allTests = [
("testExample", testExample),
]
}
我得到以下错误(似乎没有找到CoreML模型):
Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value
我一定错过了什么…… 我希望我的描述足够清晰和详细。 感谢您的帮助!
【问题讨论】:
标签: swift coreml swift-package-manager