【问题标题】:Can't call function with Swift Closure as argument不能以 Swift Closure 作为参数调用函数
【发布时间】:2014-12-13 00:50:43
【问题描述】:

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

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

【问题讨论】:

    标签: ios swift closures


    【解决方案1】:

    首先,您似乎正试图在类本身上调用 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        
    }
    

    【讨论】:

      【解决方案2】:

      调用函数的最简单方法是使用尾随闭包,如下所示:

      APIHelper.getArticles { (result:Array!, error:NSError!) -> Void in
          NSLog("No more error!")
      }
      

      由于您的函数只有一个参数,并且该参数是一个闭包,因此您可以取消函数参数的括号。

      【讨论】:

        猜你喜欢
        • 2020-05-13
        • 1970-01-01
        • 2019-11-30
        • 2016-05-24
        • 1970-01-01
        • 2018-07-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多