Swift 中的完成处理程序

3

我是一名相对新手的Swift开发者,正在努力掌握闭包和完成处理程序。在名为ObjectData的结构体内,我有一个带有以下声明的函数。

func getData(id1:Int, id2:Int, completion: (dataObject? -> Void)) 

我正在尝试调用这个函数:

ObjectData.getData(1, id2: 2){
    (let myObject) in
}

但我遇到了以下错误:

无法使用类型为 '(NSNumber,id2:NSNumber,(_) - > _)'的参数列表调用 'getData'

请问有人能帮忙吗?

在这里,dataObject 是一种类型吗?(dataObject? -> Void) - Nikita Kukushkin
是的,dataObject 是另一个结构体,我不知道为什么它没有显示成浅蓝色。@nkukushkin - c11ada
它没有显示,因为它没有以大写字母开头(我猜测)。你应该始终使用大写字母开头命名你的对象,采用驼峰式命名法 :) - Jiri Trecak
4个回答

4

为了更好的可读性,将标题更改为此。请记住,您必须声明类型,而不是变量名:

func getData(id1:Int, id2:Int, completion: (ObjectData?) -> (Void))

我个人使用这种语法来使用闭包:

self.getData(1, id2: 1) { (data) -> (Void) in

     // Some code executed in closure
}

如果你想进一步学习,可以在这里找到完整的闭包语法(请注意网站的适当名称)。 希望能对你有所帮助!


嗨Jiri,我的代码中dataObject是一种数据类型。这就是为什么我感到困惑的原因,因为我在其他地方做过类似的事情,而且它也起作用了。 - c11ada
不行,那没起作用...所有的代码看起来都没问题...但它就是不想工作 :(。 - c11ada
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Jiri Trecak
这是正确的...这是我自己的新手错误...我的语法是正确的!!问题在于我的函数声明中使用了Int,但在函数调用中我却传递了NSNumber。因此出现了错误。 - c11ada

1

我现在离我的 Mac 很远,所以无法测试,但可以尝试这个:

ObjectData.getData(1, id2: 2, (dataObject) -> { 
...code...
});

我现在无法进行检查,但我认为这也应该有效:

    ObjectData.getData(1, id2: 2)(dataObject){ 
...code...
}

0

尝试先初始化您的类(例如 var objectData = ObjectData()),然后使用 objectData.getData 调用函数... 应该可以这样工作..


0
在SWIFT 3中,它被称为完成闭包。
func getData(id1:Int, id2:Int, completion:@escaping(dataObject?) -> (Void)) {

    //Do the stuff before calling completion closure
    completion(value as? dataObject)   
}

ObjectData.getData(id1:1, id2: 2,completion:{(data) -> (Void) in
    //Do the completion stuff here
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接