Swift 4产生错误中的Watson Assistant

时间:2019-01-06 00:25:10

标签: swift compiler-errors ibm-watson watson-conversation

我试图将用Swift编码的iOS项目连接到我已经创建的Watson Assistant实例。问题是,我在编译时无法克服“上下文关闭类型”错误。

我对Swift还是比较陌生,我还没有找到解决方案。

该错误发生在IBM自己提供的代码块中(这里是链接:https://console.bluemix.net/docs/swift/machine_learning/conversation.html#before-you-begin)。我可以发现的一件事是,这很可能是对Swift 4进行更新的结果。更具体地说,这是在第三条评论之后的“响应于”语句。

<?php header('Content-type: text/html; charset=utf-8'); ?>

这是错误本身:

上下文闭包类型'(RestResponse ?, WatsonError?)->虚空'(aka'((可选>,可选)->()')需要2个参数,但是在闭包主体中使用了1个

更新: 我尝试用“(响应,错误)”替换“响应”,但这会导致以下错误消息: “ RestResponse”类型的值?没有成员“上下文” “ RestResponse”类型的值?没有成员“输出” 而使用“((错误,响应)”),则会导致以下错误: 类型为“ WatsonError?”的值(又称“可选”)没有成员“输出” 类型为“ WatsonError?”的值(又称“可选”)没有成员“上下文”

以下是有关.message函数的文档: first screenshot second screenshot

预先感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

interface EventListeners { addEventListener(type: string, handler: () => void): void; }; function on<T extends EventListeners>(this: T, type: string, handler: () => void): T { this.addEventListener(type, handler); return this; } var element = document.getElementById('elm'); var request = new XMLHttpRequest(); // had to declare this interface in order to use this as return type interface EventListenersExt extends EventListeners { on(type: string, handler: () => void): this; } function addOn<T extends EventListeners>(t: T): T & EventListenersExt { return Object.assign(t, { on }); } const elementExt = addOn(element); const requestExt = addOn(request); const e = elementExt.on('click', () => { }).on('keyup', () => { }); // const e: HTMLElement & EventListenersExt const r = requestExt.on('load', () => { }); // const r: XMLHttpRequest & EventListenersExt 在名为RestResponse的字段中包含.message调用的结果。因此,要访问resultoutput,请使用contextresponse.result.output

答案 1 :(得分:0)

如果您提供更多类似的描述,将会很有帮助:

  1. 您用于编译目标的快速版本
  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())")
    }
}