首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将回调Swift转换为NSDictionary

将回调Swift转换为NSDictionary
EN

Stack Overflow用户
提问于 2016-11-01 10:53:48
回答 3查看 2.4K关注 0票数 0

我有一个网络连接,使用JSON读取数据,并进行回调;

代码语言:javascript
运行
复制
executeRequestURL(requestURL: url, taskCallback: {(status, resp) -> Void in

            if (status == true) {
                if let results = resp as? NSDictionary {
                    print ("\(results.count) results found")
                    let list = results.allValues.first as! NSArray

                    print (list)
                }

            } else {
                print ("Error -- \(resp)")
            }
        })

这呼唤;

代码语言:javascript
运行
复制
private class func executeRequestURL(requestURL: NSURL, taskCallback: @escaping (Bool, AnyObject?) -> ()) {
        print ("Attempting URL -- \(requestURL)")

        let request: NSURLRequest = NSURLRequest(url: requestURL as URL, cachePolicy: .reloadIgnoringLocalAndRemoteCacheData, timeoutInterval: kAPI_TIMEOUT)

        let session: URLSession = URLSession.shared


        let task = session.dataTask(with: request as URLRequest, completionHandler: {
            (data, response, error) in

            guard error == nil else {
                print(error)
                return
            }
            guard let data = data else {
                print("Data is empty")
                return
            }

            let json = try! JSONSerialization.jsonObject(with: data, options: [])
            //print(json)

            if let response = response as? HTTPURLResponse , 200...299 ~= response.statusCode {
                taskCallback(true, json as AnyObject?)
            } else {
                taskCallback(false, json as AnyObject?)
            }

        })
        task.resume()
    }

我遇到的问题是,我想要将结果读入字典,循环遍历并创建对象。

现在,我将把我的代码放在executeRequestURL中,以确保其工作正常,但我打算为所需的实体分离这段代码。

问题:

我如何把resp读成字典呢?

谢谢

抽样答复如下;

代码语言:javascript
运行
复制
{
  "objects": [
    {
      "uid": "coll_20ce39424470457c925f823fc150b3d4",
      "title": "Popular",
      "temp_image": "",
      "body": "",
      "active": true,
      "slug": "popular",
      "created": "2014-10-25T12:45:54+00:00",
      "modified": "2014-10-25T12:45:54.159000+00:00",
      "ends_on": "2100-01-01T00:00:00+00:00",
    }
  ]
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-11-01 11:47:06

由于JSON是一个字典,所以从回调返回一个字典([String:Any])。在Swift 3中,AnyObject已经变成了Any。Swift强大的类型体系鼓励人们始终做到尽可能的具体。

做一个更好的错误处理!您应该返回一个错误,而不是只返回false

代码使用新的Swift 3结构URLURLRequest

代码语言:javascript
运行
复制
private class func executeRequestURL(requestURL: URL, taskCallback: @escaping (Bool, [String:Any]?) -> ()) {
  print ("Attempting URL -- \(requestURL)")

  let request = URLRequest(url: requestURL, cachePolicy: .reloadIgnoringLocalAndRemoteCacheData, timeoutInterval: kAPI_TIMEOUT)

  let session = URLSession.shared


  let task = session.dataTask(with: request, completionHandler: {
    (data, response, error) in

    guard error == nil else {
      print(error)
      taskCallback(false, nil)
      return
    }
    guard let data = data else {
      print("Data is empty")  // <- this will never be reached. If there is no error,
      taskCallback(false, nil) // data is always non-nil.
      return
    }
    if let response = response as? HTTPURLResponse , 200...299 ~= response.statusCode {
      let json = try! JSONSerialization.jsonObject(with: data, options: []) as!  [String:Any]
      taskCallback(true, json)
    } else {
      taskCallback(false, nil)
    }
  })
  task.resume()
}

JSON结果包含一个带有一个键objects的字典,其中包含一个字典数组。JSON集合类型非常容易区分:{}是字典,[]是数组。

若要将JSON映射到对象,请创建一个结构

代码语言:javascript
运行
复制
struct Item {

  var uid : String
  var title : String
  var tempImage : String
  var body : String
  var active : Bool
  var slug : String
  var created : String
  var modified : String
  var endOn : String
}

和一个数组

代码语言:javascript
运行
复制
var items = [Item]()

然后将字典映射到Item

代码语言:javascript
运行
复制
if let objects = json["objects"] as? [[String:Any]] {
  for object in objects {
    let uid = object["uid"] as! String
    var title = object["title"] as! String
    var tempImage = object["temp_image"] as! String
    var body = object["body"] as! String
    var active = object["active"] as! Bool
    var slug = object["slug"] as! String
    var created = object["created"] as! String
    var modified  = object["modified"] as! String
    var endOn  = object["end_on"] as! String
    let item = Item(uid: uid, title: title, tempImage:tempImage, body: body, active: active, slug: slug, created: created, modified: modified, endOn: endOn)
    items.append(item)

  }

JSON值似乎来自包含所有字段的数据库,因此强制展开的值是安全的。

票数 2
EN

Stack Overflow用户

发布于 2016-11-01 11:17:27

我是这样做的:

代码语言:javascript
运行
复制
func getHttpData(urlAddress : String)
    {
        // Asynchronous Http call to your api url, using NSURLSession:
        guard let url = URL(string: urlAddress) else
        {
            print("Url conversion issue.")
            return
        }
        URLSession.shared.dataTask(with: url, completionHandler: { (data, response, error) -> Void in
            // Check if data was received successfully
            if error == nil && data != nil {
                do {
                    // Convert NSData to Dictionary where keys are of type String, and values are of any type
                    let json = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.mutableContainers) as! [String:AnyObject]
                    // Call whatever function you want to do with your dictionary
                    useMyDictionary(dictionary: json)
                } catch {
                    print(error)
                    // Something went wrong
                }
            }
            else if error != nil
            {
                print(error)
            }
        }).resume()
    }
票数 1
EN

Stack Overflow用户

发布于 2016-11-01 11:35:53

还有很多其他的方法,但我喜欢使用ObjectMapper。在我看来更干净。因此,只需创建一个新的Swift文件,导入ObjectMapper并编写以下代码。

代码语言:javascript
运行
复制
 class yourDataModel: Mappable {

// MARK: - Constants & Variables

var myObjects: [yourDataModel]

required init?(_ map: Map) {
    myObjects = []

}

func mapping(map: Map) {
    myObjects               <- map["objects"]
}

}

class YourCustomObjects: Mappable {

// MARK: - Constants & Variables

var userId:String
var title:String
var tempimage:String
var body:String
var active:Bool
var slug : String
var createdDate:String
var modifiedDate:String
var endDate:String

// MARK: - init

required init?(_ map: Map) {

    userId = ""
    title = ""
    tempimage = ""
    body = ""
    active = false
    slug = ""
    createdDate = ""
    modifiedDate = ""
    endDate = ""

}

func mapping(map: Map) {

    userId                      <- map["uid"]
    title                       <- map["title"]
    tempimage                   <- map["temp_image"]
    body                        <- map["body"]
    active                      <- map["active"]
    slug                        <- map["slug"]
    createdDate                 <- map["created"]
    modifiedDate                <- map["modified"]
    endDate                     <- map["ends_on"]

}

}

基本上,它是您的模型类,现在您只需在JSON中传递您的结果,希望它是一个AnyObject,并且它将给您一个数组,其中包含所有的“对象”。你可以像下面这样使用它

代码语言:javascript
运行
复制
if let data = Mapper<yourDataModel>().map(resp){
    print(data)
 }

试试这个,如果你遇到任何困难,请告诉我。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40358637

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档