swift 如何为我的AppShortcutsProvider返回多个AppShortcuts

zaq34kh6  于 2023-06-21  发布在  Swift
关注(0)|答案(2)|浏览(236)

为了让你的iOS应用自动支持Siri(而不是要求用户手动添加快捷方式),iOS 16提供了应用快捷方式。

我想指定多个Siri应用快捷方式-每个Intent一个。但是我在这个Swift语法上有点卡住了,我相信有一些简单的东西。

添加应用快捷方式的标准Swift代码段如下所示。
让我困惑的是,appShortcuts被定义为AppShortcuts的列表([AppShortcut]),但初始化器是一个单一的值(AppShortcut)。
1.我不明白这是怎么编译的。是否有扩展或其他东西扰乱了返回类型?
1.如果我把它改为返回一个列表,我会得到Cannot convert value of type '[AppShortcut]' to expected argument type 'AppShortcut'--但我不是Swift的天才,无法弄清楚为什么预期的参数类型确实是AppShortcut

== AppIntents ==
...
public protocol AppShortcutsProvider {
    static var appShortcuts: [AppShortcut] { get }
}
...

== My intent ==

import AppIntents
struct AppShortcuts: AppShortcutsProvider {
  @AppShortcutsBuilder
  static var appShortcuts: [AppShortcut] {
    AppShortcut(
      intent: OrderStatusIntent(),
      phrases: ["Where is my \(.applicationName) order?",
        "\(.applicationName) order status"]
    )
  }
}

如果我在Swift Playground中创建一个代码段,一切都会按预期工作。列表中的单个项目。

public struct AppShortcut {
    var title: String
}

public protocol AppShortcutsProvider {
    static var appShortcuts: [AppShortcut] { get }
}

struct BookShortcuts:AppShortcutsProvider {
    static var appShortcuts: [AppShortcut]{[
    AppShortcut(
        title:"one"
    )]
    }
}

print(BookShortcuts.appShortcuts)
u4dcyp6a

u4dcyp6a1#

解决方案是:@AppShortcutsBuilder指令是一个结果生成器,它是一个修饰性的编译时指令,用于删除列表中的括号和逗号(AFAICT我看不出它还有其他用途)。如果有人能教我它的功能价值,那就太棒了。
了解有关result builders的更多信息

jv4diomz

jv4diomz2#

这对我很有效:

import AppIntents
struct AppShortcuts: AppShortcutsProvider {
  @AppShortcutsBuilder
  static var appShortcuts: [AppShortcut] {
    AppShortcut(
      intent: OrderStatusIntent(),
      phrases: ["Where is my \(.applicationName) order?",
        "\(.applicationName) order status"],
      shortTitle: "Order Status"
    )
    AppShortcut(
      intent: OrderPriceIntent(),
      phrases: ["How much is my \(.applicationName) order?",
        "\(.applicationName) order price"],
      shortTitle: "Order Price"
    )
  }
}

相关问题