Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何获取结构中的数据_Ios_Swift - Fatal编程技术网

Ios 如何获取结构中的数据

Ios 如何获取结构中的数据,ios,swift,Ios,Swift,我的json响应是 { "success" : "1", "totalpage" : "2", "blogdata" : [ { "int_glocode" : "18", "var_blogtitle" : "ssss", "tblogdescription" : "ssssss", "var_images" : "http//url", "

我的json响应是

 {
     "success" : "1",
      "totalpage" : "2",
      "blogdata" : [
         {
          "int_glocode" : "18",
          "var_blogtitle" : "ssss",
          "tblogdescription" : "ssssss",
          "var_images" : "http//url",
          "dt_creatdate" : "21-8-2017",
          "flag" : "false"
         }
        {
          "int_glocode" : "19",
          "var_blogtitle" : "ssss",
          "tblogdescription" : "ssssss",
          "var_images" : "http//url",
          "dt_creatdate" : "21-8-2017",
          "flag" : "false"
         }
      ]
    }
我的密码是这个。我在这段代码中使用了alamofire和swiftyjson

 struct Data:Decodable {
 var var_image: String
 var tblogdescription : String
 var var_blogtitle: String

 init(blogdata:[String:Any]) {
 self.var_blogtitle = blogdata["var_blogtitle"] as! String
 self.tblogdescription = blogdata["tblogdescription"] as! String
 self.var_image = blogdata["var_image"] as! String

  }
}
我使用这个数组来存储数据

 var datadetail = [Data]()
那么我的json部分是

Alamofire.request("url", method: .post, parameters: ["API":"get_blog_list","user_id":"18","page":"1"], encoding: URLEncoding.default).responseJSON { (response) in

 guard let datastring = response.result.value else { return }

        if let data = datastring as? [String: Any] {
            if let data1 = data["blogdata"] as? [[String:Any]] {
                for data2 in data1 {
                    if let data3 = data2 as? [String: Any] {
                        let var_blogtitle = data3["var_blogtitle"] as? String
                        let var_image = data3["var_image"] as? String
                        let tblogdescription = data3["tblogdescription"] as? String

                       self.datadetail.append(Data(blogdata: tblogdescription))
                        self.datadetail.append(Data(blogdata: var_image))
                        self.datadetail.append(Data(blogdata: var_blogtitle))
                    }
                    else{
                        print("Error")
                    }
                }
            }
        }
    }
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return datadetail.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
     let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! detailsTableViewCell

     let value = datadetail[indexPath.row]
    cell.descriptionlabel.text = value.tblogdescription
    cell.titlelabel.text = value.var_blogtitle



    return cell
}
我想将var_blogtile、var_image、tblogdescription的数据添加到结构中,以便在表视图中显示该数据。我尝试了这个代码,得到了回应。我得到了var_blogtile、var_image和tblogdescription数据,但在append部分出现了错误。我想我的结构部分错了。请帮帮我。

提前谢谢。

更改结构名称

struct Values:Decodable {
 var var_image: String
 var tblogdescription : String
 var var_blogtitle: String

 init(blogdata:[String:Any]) {
 self.var_blogtitle = blogdata["var_blogtitle"] as! String
 self.tblogdescription = blogdata["tblogdescription"] as! String
 self.var_image = blogdata["var_image"] as! String

  }
}

这是tableview的一部分

Alamofire.request("url", method: .post, parameters: ["API":"get_blog_list","user_id":"18","page":"1"], encoding: URLEncoding.default).responseJSON { (response) in

 guard let datastring = response.result.value else { return }

        if let data = datastring as? [String: Any] {
            if let data1 = data["blogdata"] as? [[String:Any]] {
                for data2 in data1 {
                    if let data3 = data2 as? [String: Any] {
                        let var_blogtitle = data3["var_blogtitle"] as? String
                        let var_image = data3["var_image"] as? String
                        let tblogdescription = data3["tblogdescription"] as? String

                       self.datadetail.append(Data(blogdata: tblogdescription))
                        self.datadetail.append(Data(blogdata: var_image))
                        self.datadetail.append(Data(blogdata: var_blogtitle))
                    }
                    else{
                        print("Error")
                    }
                }
            }
        }
    }
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return datadetail.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
     let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! detailsTableViewCell

     let value = datadetail[indexPath.row]
    cell.descriptionlabel.text = value.tblogdescription
    cell.titlelabel.text = value.var_blogtitle



    return cell
}

如果您不确定api中是否有值,请将“始终”设置为可选

struct Data:Decodable {
 var var_image: String?
 var tblogdescription : String?
 var var_blogtitle: String?

 init(blogdata:[String:Any]) {
 self.var_blogtitle = blogdata["var_blogtitle"] as? String
 self.tblogdescription = blogdata["tblogdescription"] as? String
 self.var_image = blogdata["var_image"] as? String

  }
}

如果仍然出现错误,请编辑问题并显示错误

使用以下格式的结构作为回答。如果不确定属性是否每次都会出现,请将其保留为可选

struct Response: Decodable {
    var success: String
    var totalpage: String
    var blogdata: [BlogData]
}

struct BlogData: Decodable {
    var int_glocode: String
    var var_blogtitle: String?
    var tblogdescription: String?
    var var_images: String?
    var dt_creatdate: String?
    var flag: String
}
只需将
响应
模式中的响应解析为:

var responseModal = Response()
if let data = response.result.value as? [String: Any] {
    do {
        let jsonData = try JSONSerialization.data(withJSONObject: data, options: .prettyPrinted)
        responseModal = try JSONDecoder().decode(Response.self, from: jsonData)
    } catch {
        print(error)
    }
}

更改ios中可用的默认数据属性struct name,并初始化您的[String:Any]不可变的任何名称struct as
Data
。它可能与现有的Swift
Data
struct冲突。如果我使用这个数组var datadetail=[Values]()。然后我打印datadetail,以便在datadetail write?中获得附加值,然后在表视图中获取值,如下所示。cell.datalabel.text=datadetail[indexath.row].var\u blogtitle。这个标题显示在tableview中。写入?但当我在输出中打印datadetail时,[]中没有数据。请检查我编辑的答案,并确保数组datadetail有值。更改后,我在print语句中获得了数据,但在表数据中没有。为什么
BlogData
中的所有成员都是可选的?JSON清楚地包含字典中的所有字段。是的,我保留它是为了表明如果键根本不出现,我们可以处理这种情况。@vadian,更新了struct
Response
的答案以及struct
BlogData
的一些键。