无法使用Swift Closure作为参数调用函数

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)

有没有其他人之前得到此错误?如果是这样,我该如何调用此方法并实现闭包?

Mic*_*lum 5

首先,看起来你正试图在类本身上调用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)