如何从来自 REST 服务的另一个数组中匹配一个数组?

Posted

技术标签:

【中文标题】如何从来自 REST 服务的另一个数组中匹配一个数组?【英文标题】:How to conform an array from another array that comes from a REST Service? 【发布时间】:2017-07-03 22:43:23 【问题描述】:

我正在尝试使用来自 REST 服务的元素创建一个 TableView,它是一个包含描述、标题、类别和图像的优惠券列表。所以我先反序列化数据,将其放入一个数组中,然后将其转换为每个部分的特定数组,但我的循环不起作用,谁能帮帮我?

这是我的代码:

    var couponsTitle : [String] = []

    var couponsDesc : [String] = []

    var couponsCat : [String] = []



    func getCoupons()

        let miURL = URL(string: RequestConstants.requestUrlBase)

        let request =  NSMutableURLRequest(url: miURL!)

        request.httpMethod = "GET"

        if let data = try? Data(contentsOf: miURL! as URL) 

            do 

                let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? NSDictionary

                let parseJSON = json

                let object = parseJSON?["object"] as! NSDictionary

                let mainCoupon = object["mainCoupon"] as! NSArray 

                let coupons = object["coupons"] as! NSArray



                for i in mainCoupon 
                    self.couponsCat.append((mainCoupon[i as! Int] as AnyObject).value(forKey: "category"))
                

                for i in coupons 
                    self.couponsCat.append((coupons[i as! Int] as AnyObject).value(forKey: "category"))
                

                for i in mainCoupon 

                    self.couponsDesc.append((mainCoupon[i as! Int] as AnyObject).value(forKey: “description"))

                



                for i in coupons 

                    self.couponsDesc.append((coupons[i as! Int] as AnyObject).value(forKey: “description"))

                

                for i in mainCoupon 

                    self.couponsTitle.append((mainCoupon[i as! Int] as AnyObject).value(forKey: “name"))

                



                for i in coupons 

                    self.couponsTitle.append((coupons[i as! Int] as AnyObject).value(forKey: “name"))

                

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

        cell.couponTitle.text = couponsTitle[indexPath.row]
        cell.couponDescription.text = couponsDesc[indexPath.row].    
        cell.couponCategory.text = couponsCat[indexPath.row]
        return cell


我最大的问题是我不知道如何将数组放入循环中,但每个部分的规范(我的意思是标题、描述、类别等)有什么想法吗?

【问题讨论】:

【参考方案1】:

与其拥有三个数组(每个属性一个),为什么不为 Coupon 提供一个具有三个属性的自定义类?

class Coupon: AnyObject 

    var description: String
    var title: String
    var category: String

    init(description: String, title: String, category: String) 
        self.description = description
        self.title = title
        self.category = category
    

如果你这样做,你可以通过做这样的事情来避免这么多循环

for coupon in mainCoupon 

            let description = mainCoupon["description"]
            let title = mainCoupon["name"]
            let category = mainCoupon["category"]

            let newCoupon = Coupon(description: description, title: title, category: category)

            couponsArray.append(newCoupon)
        

【讨论】:

非常感谢您的回答,我需要这样的东西 我只有一个问题,我必须如何声明“couponsArray”?因为我有这样的:“ var couponsArray : [String] = [] ”,它给我一个错误,上面写着:“无法将'Coupon'类型的值转换为预期的参数类型'String'。你有线索吗?这个请? 错误告诉您不能将优惠券添加到字符串数组。您评论中的示例数组声明了一个字符串数组。你需要的是一个像这样的优惠券数组,“var couponsArray: [Coupon] = []”。然后你应该可以在你的数组中添加一张优惠券。 好的,现在我在 cellForIndexPath 有一个问题,因为如果我按原样声明它:“cell.couponTitle.text = couponsTitle[indexPath.row]”会抛出这个错误:'无法分配类型'CouponsTitle'的值输入'String?''......所以我尝试过的解决方案是:“cell.couponTitle.text = couponsTitle[indexPath.row] as AnyObject as?String”,但仍然没有工作。我该如何解决?

以上是关于如何从来自 REST 服务的另一个数组中匹配一个数组?的主要内容,如果未能解决你的问题,请参考以下文章

TS / JS-如果对象的属性与数组中的另一个属性相匹配,则从对象数组中获取“值”

如何从 REST API 定义多个或嵌套 json 数据的数组类型

基于来自 JSON 请求主体的另一个属性,反序列化来自 JSON 请求主体的抽象属性

如何从 WCF REST Web 服务中的改造中获取来自@Part List<MultipartBody.Part> 发布请求的文件?

使一个数组等于特定对象的另一个数组

如何获取通用地图作为来自 restTemplate 交换方法的响应?