hgw*_*tle 2 closures ios swift
我编写了一个函数来进行Web服务调用,获取一些JSON,形成一个包含数据的数组,并在完成时将其返回到闭包中.我是这个语法的新手,但编译器说它是正确的所以我假设它是.
class APIHelper: NSObject {
func getArticles(completion: (result: NSArray, error: NSError)->()) {
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,我无法弄清楚如何调用此方法.当我尝试时,自动完成不会显示我的完成关闭.相反,它的行为就像我应该传递该方法的一个实例(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'
}
Run Code Online (Sandbox Code Playgroud)
有没有其他人之前得到此错误?如果是这样,我该如何调用此方法并实现闭包?
首先,看起来你正试图在类本身上调用APIHelper的实例方法.如果您希望这样做,您需要将类的实例作为方法的接收者,或者您需要将您的方法声明为类方法,以便能够以您尝试的方式使用它.
class APIHelper: NSObject {
class func getArticles(completion: (result: NSArray, error: NSError)->()) {
}
}
Run Code Online (Sandbox Code Playgroud)
此外,参数的类型必须与用作参数的参数类型相同.如果您已声明该方法采用NSArray对象,则应将其作为NSArray而不是Array访问,因此您应该像这样调用方法.
APIHelper.getArticles( { (result: NSArray, error: NSError) -> Void in
// stuff
})
Run Code Online (Sandbox Code Playgroud)
这可以简化为以下内容,它允许Swift的类型推断来确定参数的类型,因此您不必担心它们不匹配.
APIHelper.getArticles { result, error in
// stuff
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2522 次 |
| 最近记录: |