迁移到 Swift 2 的错误:从类型的抛出函数到非抛出函数类型的无效转换以及使用未声明的类型

Posted

技术标签:

【中文标题】迁移到 Swift 2 的错误:从类型的抛出函数到非抛出函数类型的无效转换以及使用未声明的类型【英文标题】:Errors migrating to Swift 2: Invalid conversion from throwing function of type to non-throwing function type and use of undeclared type 【发布时间】:2016-02-17 18:52:24 【问题描述】:

我正在尝试使用 Swift 2 语法进行 try...do...catch 进行错误处理,但是在尝试修改我的代码后,我遇到了一些我无法弄清楚的错误。在此先感谢您的帮助。

在 dispatch_async 行上,错误:从 '() throws -> ()' 类型的抛出函数到非抛出函数类型 'dispatch_block_t' 的无效转换(又名 '@convention(block) () -> () ')。

稍后在代码中,关于“让 resultArray.NSArray”... 我收到错误“使用未声明的类型 NSArray”。

func searchFlickrForString(searchStr:String, completion:(searchString:String!, FlickrPhotos:NSMutableArray!, error:NSError!)->())
    let searchURL:String = FlickrHelper.URLForSearchString(searchStr)

    let queue:dispatch_queue_t = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)

    dispatch_async(queue, 

        var error:NSError?

        let searchResultString:String! = try String(contentsOfURL: NSURL(fileURLWithPath: searchURL), encoding: NSUTF8StringEncoding)
        do 
            // Parse JSON Response
            let jsonData:NSData! = searchResultString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)

            let resultDict:NSDictionary! = try NSJSONSerialization.JSONObjectWithData(jsonData, options: []) as! NSDictionary
            do 
                let status:String = resultDict.objectForKey("stat") as! String
                if status ==  "fail" 
                    let error:NSError? = NSError(domain: "FlickrSearch", code: 0, userInfo: [NSLocalizedFailureReasonErrorKey:resultDict.objectForKey("message")!])

                    completion(searchString: searchStr, FlickrPhotos:  nil, error: error)
                 else 
                    let resultArray:NSArrray = resultDict.objectForKey("photos").objectForKey("photo") as NSArray

                    let flickrPhotos:NSMutableArray = NSMutableArray()

                    for photoObject in resultArray
                        let photoDict:NSDictionary = photoObject as NSDictionary

                        var flickrPhoto:FlickrPhoto = FlickrPhoto()
                        flickrPhoto.farm = photoDict.objectForKey("farm") as Int
                        flickrPhoto.server = photoDict.objectForKey("farm") as String
                        flickrPhoto.secret = photoDict.objectForKey("farm") as String
                        flickrPhoto.photoID = photoDict.objectForKey("farm") as String

                        let searchURL:String = FlickrHelper.URLForFlickrPhoto(flickrPhoto, size: "m")
                        //download image
                        let imageData:NSData = NSData(contentsOfURL: searchURL, options: nil)

                    
                
             catch let error as NSError
                completion(searchString: searchStr, FlickrPhotos: nil, error: error)
            
         catch 
            //completion(searchString: searchStr, FlickrPhotos: nil, error: error)
        


    )


【问题讨论】:

运气好吗?你有什么解决办法吗? 【参考方案1】:

要修复第一个错误,请移动第一个

do 

直接下

dispatch_async(queue

对于您的第二个错误:将您的代码更改为

let resultArray = resultDict.objectForKey("photos")!.objectForKey("photo") as! NSArray

还将每个“as”替换为“as!”

将 searchURL 声明更改为:

let searchURL = NSURL(string: FlickrHelper.URLForFlickrPhoto(flickrPhoto, size: "m"))

【讨论】:

以上是关于迁移到 Swift 2 的错误:从类型的抛出函数到非抛出函数类型的无效转换以及使用未声明的类型的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Do-Try-Catch 修复“从 X 类型的抛出函数到 Y 类型的非抛出函数的无效转换”

从 '(_) throws -> ()' 类型的抛出函数到非抛出函数类型 '(DataSnapshot) -> Void' 的无效转换

从 '(_) throws -> Void' 类型的抛出函数到非抛出函数类型 '([UNNotificationRequest]) -> Void 的无效转换

从 '(_, _, _) throws -> ()' 类型的抛出函数到非抛出函数类型 '(URLResponse?, Data?, Error?) -> Void 的无效转换

Alamofire 4从“(_) throws ->()”类型的抛出函数到非抛出函数类型“(DataResponse <Any>)-> Void”的无效转换

PHP 的异常处理错误的抛出及错误回调函数 (转)