我编写了一个函数来进行Web服务调用,获取一些JSON,形成一个包含数据的数组,并在完成时将其返回到闭包中。我是这个语法的新手,但是编译器说它是正确的,所以我假设它是。
class APIHelper: NSObject {
func getArticles(completion: (result: NSArray, error: NSError)->()) {
}
}
我的问题是,我无法弄清楚如何调用此方法。当我尝试时,自动完成不会显示我的完成关闭。相反,它的行为就像我应该将该方法传递给它(APIHelper)中声明的类的实例。
//View Controller
override func viewDidLoad() {
super.viewDidLoad()
APIHelper.getArticles( { (result: Array!, error: NSError!) -> Void in
}) //COMPILER ERROR: '(NSArray!, NSError!) -> Void' is not convertible to 'APIHelper'
}
有没有其他人之前得到此错误?如果是这样,我该如何调用此方法并实现闭包?
答案 0 :(得分:5)
首先,您似乎试图在类本身上调用APIHelper的实例方法。如果您希望这样做,您需要将类的实例作为方法的接收者,或者您需要将您的方法声明为类方法,以便能够以您的方式使用它。重新尝试。
class APIHelper: NSObject {
class func getArticles(completion: (result: NSArray, error: NSError)->()) {
}
}
此外,参数的类型必须与用作参数的参数类型相同。如果您已声明该方法采用NSArray对象,则应将其作为NSArray而不是Array访问,因此您应该像这样调用该方法。
APIHelper.getArticles( { (result: NSArray, error: NSError) -> Void in
// stuff
})
可以简化为以下内容,它允许Swift的类型推断来确定参数的类型,因此您不必担心它们不匹配。
APIHelper.getArticles { result, error in
// stuff
}
答案 1 :(得分:0)
调用函数的最简单方法是使用尾随闭包,如下所示:
APIHelper.getArticles { (result:Array!, error:NSError!) -> Void in
NSLog("No more error!")
}
由于你的函数只有一个参数,并且因为那个参数是一个闭包,你就可以取消函数参数的括号。