【问题标题】:Use Type T as parameter in completion handler在完成处理程序中使用类型 T 作为参数
【发布时间】:2015-10-08 19:10:40
【问题描述】:

我为 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,但这给了我这个错误:无法使用类型为'(NSURL,完成:(_)->())'的参数列表调用'getDataAsyncFromURLRequest'

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

【问题讨论】:

    标签: ios swift nsurlsession


    【解决方案1】:

    很容易为什么不用 AnyObject

    func getDataAsyncFromURLRequest(url: NSURL, 完成: (AnyObject) -> ()) { 让请求 = NSMutableURLRequest(URL: url) 让会话 = NSURLSession.sharedSession() let task = session.dataTaskWithRequest(request) { (data, response, error) -> Void in 如果错误!= nil { 打印(“错误=\(错误)”) 返回 } 别的 { 让 datastring = NSString(data: data!, encoding: NSUTF8StringEncoding) 如果让数据 = 数据字符串!.dataUsingEncoding(NSUTF8StringEncoding) { 做 { 让 json = 试试 NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions()) 完成(json) } 抓住 { print("json 错误:\(error)") } } } } 任务.resume() }

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

    所以在得到结果后,你也可以在完成块中检查结果的类型

    这样

    如果结果是 [String:AnyObject]
    ... 否则,如果结果是 [AnyObject] ... 别的 //抛出错误:因为那不是JSON

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多