Swift 2 关闭问题

Swift 2 Closure troubles

原来我在 Swift 2 个闭包方面遇到了一些麻烦,这是我的问题:

func getImgurHotListWithViralBool(viral:Bool) -> NSArray
{
    IMGGalleryRequest.hotGalleryPage(0, withViralSort: viral,
                                     success:{
                                        (objects:NSArray)  in
//It gives the error here*********
                                     },
                                     failure: {(error:NSError) in

                                     })
}

它给出错误:

Cannot convert value of type '(NSArray) -> ()' to expected argument type '(([AnyObject]!) -> Void)!'

更新: 值得庆幸的是,Marco Boschi 帮助我解决了这个问题;

func getImgurHotListWithViralBool(viral:Bool) -> NSArray {
    IMGGalleryRequest.hotGalleryPage(0, withViralSort: viral,
        success: { (objects: [AnyObject]!)  in
            // ...
        }, failure: { (error:NSError) in
            // ...
        })
}

现在错误出现在 error:NSError 即:

Cannot convert value of type '(NSError) -> ()' to expected argument type '(([AnyObject]!) -> Void)!'

我该怎么办?

您正在使用的函数需要一个闭包,该闭包接受一个 Swift 数组作为单个参数,一个隐式展开的 AnyObjects ([AnyObject]!) 数组,如中所述错误消息,但是您使用的是旧的 NSArray 并且编译器无法将您的闭包类型转换为请求的类型,因此出现错误,如下更改代码即可解决。

func getImgurHotListWithViralBool(viral:Bool) -> NSArray {
    IMGGalleryRequest.hotGalleryPage(0, withViralSort: viral,
        success: { (objects: [AnyObject]!)  in
            // ...
        }, failure: { (error:NSError) in
            // ...
        })
}

更新: 你得到的第二个错误和以前一样,API 想要一个接受隐式展开的 AnyObjects 数组的闭包但是你提供一个带 NSError 的签名,你必须将 failure 的签名更改为

failure: { (error: [AnyObject]!) in
    // ...
}

为了解决。请务必查看 API 的文档以了解如何从数组中获取错误。