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

时间:2014-12-12 16:33:33

标签: ios swift closures

我编写了一个函数来进行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'
}

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

2 个答案:

答案 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!")
}

由于你的函数只有一个参数,并且因为那个参数是一个闭包,你就可以取消函数参数的括号。