gpt4 book ai didi

ios - 在 NSDictionary 的数组对象中访问第二层数组

转载 作者:搜寻专家 更新时间:2023-11-01 06:27:21 26 4
gpt4 key购买 nike

我正在尝试 NSDictionary 的数组对象中的第二级数组,但它返回 nil

我首先定义了 NSDictionary 然后访问了数组的第一层,直到现在一切都很好。

let dict = JSON(responseObject as! NSDictionary)
let arrayData = dict["data"].arrayObject! as NSArray
print("arrayData", arrayData)

当打印 arrayData 时,我得到以下返回值

data =     (
{
categories = (
{
categories = "<null>";
"category_id" = 333;
image = "https://www.example.com/images/1.jpg";
name = "Sub Category One";
"parent_id" = 1000;
},
{
categories = "<null>";
"category_id" = 444;
image = "https://www.example.com/images/2.jpg";
name = "Sub Category Two";
"parent_id" = 1000;
},
{
categories = "<null>";
"category_id" = 555;
image = "https://www.example.com/images/3.jpg";
name = "Sub Category Three";
"parent_id" = 1000;
}
);//end of categories array
"category_id" = 1000;
image = "https://www.examples.com/images/category.jpg";
name = "Parent Category";
"parent_id" = 0;
},
)

现在我正在尝试从上面返回的数组中访问和打印类别

所以我尝试了以下方法:

if dict["categories"].arrayObject != nil{
let arrayData2 = dict["categories"].arrayObject! as NSArray
print("arrayData2", arrayData2)
}

我也试过

if dict["data"]["categories"].arrayObject != nil{
let arrayData2 = dict["data"]["categories"].arrayObject! as NSArray
print("arrayData2", arrayData2)
}

两种方式我都得到了 nil 值,而它应该得到真正的值。

已编辑:在 ViewController 和 dataModel 结构中添加了 API 调用

View Controller中调用HTTPAPI函数

func callingHttppApi(){
DispatchQueue.main.async{
NetworkManager.sharedInstance.showLoader()
let sessionId = self.defaults.object(forKey:"token");
self.categoriesTableView.isUserInteractionEnabled = false

var requstParams = [String:Any]();
requstParams["token"] = sessionId
NetworkManager.sharedInstance.callingHttpRequest(params:requstParams, apiname:"api/cat", cuurentView: self){success,responseObject in
if success == 1{
let dict = responseObject as! NSDictionary;
if dict.object(forKey: "fault") != nil{
let fault = dict.object(forKey: "fault") as! Bool;
if fault == true{
self.loginRequest()
}
}else{
NetworkManager.sharedInstance.dismissLoader()
self.view.isUserInteractionEnabled = true
self.categoriesTableView.isUserInteractionEnabled = true
let dict = JSON(responseObject as! NSDictionary)
let arrayData = dict["data"].arrayObject! as NSArray
if dict["categories"].arrayObject != nil{
let arrayData2 = dict["categories"].arrayObject! as NSArray
print("arrayData2", arrayData2)
}
print("arrayData", arrayData)
if dict["error"].intValue == 1{
NetworkManager.sharedInstance.showErrorMessageWithBack(view: self, message: NetworkManager.sharedInstance.language(key: "error"))
}else{
self.categoriesCollModel = CategoriesViewModel(data:JSON(responseObject as! NSDictionary))
dump (self.categoriesCollModel)
}
}
}else if success == 2{
NetworkManager.sharedInstance.dismissLoader()
self.callingHttppApi()
}
}
}
}

用于转换值的数据模型结构

//
// CategoriesViewModel.swift
//

import Foundation

class Categories: NSObject{
var id:String = ""
var name:String = ""
var image:String = ""

init(data:JSON){
self.id = data["category_id"].stringValue
self.name = data["name"].stringValue
self.image = data["image"].stringValue
}

}

class SubCategories:NSObject{
var pid:String = ""
var id:String = ""
var name:String = ""
var image:String = ""

init(data:JSON) {
self.pid = data["parent_id"].stringValue
self.id = data["category_id"].stringValue
self.name = data["name"].stringValue
self.image = data["image"].stringValue
}

}

struct Categories_Data{
var id:String = ""
var categoriesArray = [SubCategories]()

init(data:JSON) {
self.id = data["category_id"].stringValue
if let arrayData = data["data"]["categories"].arrayObject {
categoriesArray = arrayData.map({(value) -> SubCategories in
return SubCategories(data:JSON(value))
})
}
}

}

class CategoriesViewModel:NSObject{
var categoryModel = [Categories]()
var subCategories = [SubCategories]()
var categories_Data = [Categories_Data]()

init(data:JSON) {

let arrayData = data["data"].arrayObject! as NSArray
categoryModel = arrayData.map({(value) -> Categories in
return Categories(data:JSON(value))
})

if data["data"]["categories"].arrayObject != nil{
let arrayData2 = data["data"]["categories"].arrayObject! as NSArray
categories_Data = arrayData2.map({(value) -> Categories_Data in
return Categories_Data(data:JSON(value))
})
}

//categoryModel = Categories(data:data)


}

var getCategories:Array<Categories>{
return categoryModel
}

var getSubCategories:Array<SubCategories>{
return subCategories
}

}

最佳答案

我强烈建议放弃 SwiftyJSON 并使用 Decodable

CategoriesViewModel 可以简化为

struct Root: Decodable {
let data : [Category]
}

struct Category: Decodable {
let categories : [Category]?
let categoryId : Int
let image : URL
let name : String
let parentId : Int
}

您需要从网络请求中获取原始数据(在以下名为 data 的代码中),然后您可以简单地将数据解码为结构并使用点符号获取值。

我添加了一个辅助函数来递归打印嵌套类别

do {
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
let result = try decoder.decode(Root.self, from: data)
printCategories(result.data)
} catch { print(error) }

func printCategories(_ categories : [Category]) {
for item in categories {
if let subCategories = item.categories {
printCategories(subCategories)
}
print(item.name, item.categoryId)
}
}

关于ios - 在 NSDictionary 的数组对象中访问第二层数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52379871/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com