在完成处理程序中使用Type T作为参数

时间:2015-10-08 10:57:17

标签: ios swift nsurlsession

我已经为URL请求编写了一个函数。这包含一个完成处理程序,它返回从URL中提取的[String: AnyObject]字典。

这个代码是:

func getDataAsyncFromURLRequest(url: NSURL, completion: ([String : AnyObject]) -> ()) {

    let request = NSMutableURLRequest(URL: url)
    let session = NSURLSession.sharedSession()

    let task = session.dataTaskWithRequest(request) { (data, response, error) -> Void in
        if error != nil {
            print("error=\(error)")
            return
        }
        else {
            let datastring = NSString(data: data!, encoding: NSUTF8StringEncoding)

            if let data = datastring!.dataUsingEncoding(NSUTF8StringEncoding) {
                do {
                    let json = try NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions()) as! [String : AnyObject]

                    completion(json)

                } catch {
                    print("json error: \(error)")

                }
            }
        }
    }
    task.resume()
}

但是,在某些情况下,我会收到[String : AnyObject]的数组,而不是字典。因此,我没有制作一个以字典数组作为完成处理程序参数的重复函数,而是可以这样做

func getDataAsyncFromURLRequest<T>(url: NSURL, completion: (T) -> ()) { 
    // code here
}

...然后这样做let json = try NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions()) as! T,但这给了我这个错误:无法调用&#39; getDataAsyncFromURLRequest&#39;使用类型&#39;的参数列表(NSURL,完成:(_) - &gt;())&#39;

如果可能的话,使完成处理程序接受具有在运行时决定的类型的参数的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

为什么不使用AnyObject

这很容易
func getDataAsyncFromURLRequest(url: NSURL, completion: (AnyObject) -> ()) {

    let request = NSMutableURLRequest(URL: url)
    let session = NSURLSession.sharedSession()

    let task = session.dataTaskWithRequest(request) { (data, response, error) -> Void in
        if error != nil {
            print("error=\(error)")
            return
        }
        else {
            let datastring = NSString(data: data!, encoding: NSUTF8StringEncoding)

            if let data = datastring!.dataUsingEncoding(NSUTF8StringEncoding) {
                do {
                    let json = try NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions())

                    completion(json)

                } catch {
                    print("json error: \(error)")

                }
            }
        }
    }
    task.resume()
}

JSONObjectWithData的结果可以是[AnyObject](Array)或[String:AnyObject]和这些项的树。

因此,在得到结果后,您还可以检查完成块中的结果类型

喜欢这个

if result is [String:AnyObject]
... else if result is [AnyObject] ... else //throw error : because then it is not JSON

相关问题