具有动态参数的应用程序意图,SwiftUI

qojgxg4l  于 2023-10-15  发布在  Swift
关注(0)|答案(1)|浏览(114)

我几乎是新的编码,我需要做一个应用程序,使用AppIntents。我希望Intent使用一个元素数组来更改文本。我们假设数组是一个字符串数组:[“山”,“车”,“球”]如果我告诉Siri:“Hey Siri,set the text to Ball”Intent应将文本更改为“Ball”。如果我告诉Siri:“嘿Siri,将文本设置为“山”,意图应更改为“山”

struct chooseWord: AppIntent {
    @Parameter(title: "Word")
    var word: String
    
    static var title: LocalizedStringResource = "Change the text"
    static var description = IntentDescription("Changes the text on screen")
    
    static var openAppWhenRun: Bool = true
    static var parameterSummary: some ParameterSummary {
        Summary("Changes the word to ...")
    }
    @MainActor
    func perform() async throws -> some IntentResult {

        return .result(dialog: "Done!")
    }
}

这是基本的Intent代码。希望你能帮助我。对不起,如果我拼错了什么或我使用错误的语法,英语不是我的第一语言。谢谢

olhwl3o2

olhwl3o21#

你基本上有两个选项来将数组输入到Shortcuts中。如果你的数组是一个 * 固定 * 的选项集,你应该使用AppEnum协议。对于一组 * 动态 * 选项(如标题中所述),您必须使用AppEntity

通过AppEntity实现动态数组

采用动态AppEntity虽然非常强大和灵活,但代码要多一点。你可以在GitHub here上找到一个很好的例子。我建议您观看Dive into App Intents WWDC会议(9:47)或查看this Apple Documentation
AppEntity必须符合Identifiable,因为Shortcuts应用程序可能会保存用户选择。它还需要一堆更多的让快捷方式应用程序知道如何显示/命名的东西。

struct BookEntity: AppEntity, Identifiable {
    var id: UUID

    var title: String

    // Visual representation e.g. in the dropdown, when selecting the entity.
    var displayRepresentation: DisplayRepresentation {
        DisplayRepresentation(title: "\(title)")
    }

    // Placeholder whenever it needs to present your entity’s type onscreen.
    static var typeDisplayRepresentation: TypeDisplayRepresentation = "Book"

    static var defaultQuery = BookQuery()
}

最后一行代码显示,您必须为每个实体提供一个EntityQuery。这用于将实体从您的应用动态馈送到Shortcuts应用。您可以进一步扩展它以使其可搜索,并添加“查找XYZ”操作。或者,您也可以将EntityStringQuery用于基本字符串实体,将EntityPropertyQuery用于具有多个属性的更复杂实体。基本定义如下:

struct BookQuery: EntityQuery {
    // Provide the list of options you want to show the user, when they select the Entity in the shortcut. You probably want to show all items you have from your array.
    func suggestedEntities() async throws -> [BookEntity] {
        try await BookManager.shared.getAllBooks()
            .map { BookEntity(id: $0.id, title: $0.title) }
    }

    // Find Entity by id to bridge the Shortcuts Entity to your App
    func entities(for identifiers: [UUID]) async throws -> [BookEntity] {
        try await MusicCatalog.shared.albums(for: identifiers)
            .map { BookEntity(id: $0.id, title: $0.title) }
    }
}

最后,你把它和你的意图联系起来,就像这样:

struct ChooseBook: AppIntent {
    @Parameter(title: "Book")
    var book: BookEntity

    // …
}

我知道这看起来很多,它是!我也花了一段时间才明白这一点,但我希望这将有助于你进入正确的方向。

相关问题