Swift 4 中的 Watson Assistant 生成错误

Watson Assistant in Swift 4 Producing Error

我正在尝试将编码为 Swift 的 iOS 项目连接到我已经创建的 Watson Assistant 实例。问题是,我无法克服编译时的 "Contextual Closure type" 错误。

我是 Swift 的新手,我还没有找到解决方案。

错误出现在IBM自己提供的代码块中(这里是link:https://console.bluemix.net/docs/swift/machine_learning/conversation.html#before-you-begin)。我能找到的一件事是,这可能是 Swift 4 更新的结果。下面是产生错误的函数;更具体地说,它是 "response in" 语句,在第三条评论之后。

func assistantExample() {
    // Assistant credentials
    let username = "shawn.soneja85@gmail.com"
    let password = "Shawn8135!"
    let workspace = "199b1f99-b28c-4b3f-b610-5933328141d5"

    // instantiate service
    let assistant = Assistant(username: username, password: password, version: "2018-03-01")

    // start a conversation
    assistant.message(workspaceID: workspace) { response in
        print("Conversation ID: \(response.context.conversationID!)")
        print("Response: \(response.output.text.joined())")

        // continue assistant
        print("Request: turn the radio on")
        let input = InputData(text: "turn the radio on")
        let request = MessageRequest(input: input, context: response.context)
        assistant.message(workspaceID: workspace, request: request) { response in
            print("Response: \(response.output.text.joined())")
        }
    }
}

这是错误本身:

上下文闭包类型“(RestResponse?, WatsonError?) -> Void”(又名“(Optional>, Optional) -> ()”)需要 2 个参数,但在闭包主体中使用了 1 个

更新: 我已尝试将 "response" 替换为“(响应,错误)”,但这会导致以下错误消息: 'RestResponse?' 类型的值没有成员 'context' 'RestResponse?' 类型的值没有成员 'output' 对于“(错误,响应)”,它会导致以下错误: 'WatsonError?' 类型的值(又名 'Optional')没有成员 'output' 'WatsonError?' 类型的值(又名 'Optional')没有成员 'context'

这里是关于 .message 函数的文档: first screenshot second screenshot

在此先感谢您的帮助!

RestResponse 在名为 result 的字段中包含 .message 调用的结果。因此,要访问 outputcontext,请使用 response.result.outputresponse.result.context

如果您提供更多描述,如:

,将会很有帮助
  1. Swift 您用来编译目标的版本
  2. 错误的行号

话虽这么说,我认为你的问题出在嵌套的 .message 方法中,我已经复制了你上面的代码,但删除了一些行以试图弄清楚(至少是我的建议),您可能在第一次调用 .message 时将第二个参数添加到回调中,但在第二次(嵌套)调用中忘记这样做,即您在 request 中传递的调用。因此,您可能在第一次调用中添加了第二个 error 参数,但对于缺少的参数却得到了完全相同的错误消息,因为您忘记了对嵌套调用执行相同的操作。我希望这会有所帮助:)

// start a conversation
assistant.message(workspaceID: workspace) { response, error in
    let input = InputData(text: "turn the radio on")
    let request = MessageRequest(input: input, context: response.context)
    assistant.message(workspaceID: workspace, request: request) { response, error in
        print("Response: \(response.output.text.joined())")
    }
}