快速排序对象数组4

时间:2018-01-30 19:01:20

标签: arrays swift sorting

我有一个对象数组,每个对象都包含折扣率,我需要按照它们的速率对它们进行排序,

struct ShopDetails {
    var shopId: Int?
    var discountRate: String?
    init(with json: Dictionary<String,Any>) {
        shopId = json["id"] as? Int
        discountRate = json["discount"] as? String

    }

我厌倦了使用这种方法对它们进行排序;

 func getShopsByDiscount() {
        let sortedImages = self.copyOfShops.sorted(by: { (shop1: ShopDetails, shop2: ShopDetails) -> Bool in
            return Int(shop1.discountRate) < Int(shop2.discountRate)
        })

    }

我试图将速率转换为整数,因为它是从后端收到的字符串,但我收到错误: value of type Any has no member discountRate. 任何想法怎么做?如果有一种方法可以在没有施法的情况下进行,那就更好了

1 个答案:

答案 0 :(得分:2)

首先,您需要验证您开始使用的数组是否为[ShopDetails]类型。该错误表明这可能是一个Objective-C NSArray,它在Swift中不起作用。如果您对此不清楚,我建议您使用Google主题:没有理由在Swift中使用NSArray

下面,我假设数组是正确的类型([ShopDetails])。从这里开始,您还需要做两件事,因为discountRate的类型为String?

  1. 您需要检查字符串是否确实存在
  2. 您需要检查它是否真的可以表示为Int
  3. 考虑到这些因素,您的排序功能可能如下所示:

    let sortedImages = copyOfShops.sorted(by: {
        (shop1: ShopDetails, shop2: ShopDetails) -> Bool in
        if let shop1String = shop1.discountRate, let shop1Value = Int(shop1String),
            let shop2String = shop2.discountRate, let shop2Value = Int(shop2String) {
            return shop1Value < shop2Value
        }
        return true
    })
    

    话虽如此,处理此问题的最佳方式是将discountRate的类型从String?更改为Int,并在执行上述检查时执行上述检查你init(with json: Dictionary<String,Any>)。如果给你字典的服务器是你控制的东西,让它切换回传递Ints而不是字符串,并且如果你不需要,则停止处理选项。