我试图将用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
预先感谢您的帮助!
答案 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
调用的结果。因此,要访问result
或output
,请使用context
和response.result.output
。
答案 1 :(得分:0)
如果您提供更多类似的描述,将会很有帮助:
话虽这么说,我认为您的问题出在嵌套的.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())")
}
}