如果满足条件,则替换集合中的元素

时间:2019-01-25 14:22:19

标签: ios swift set first-class-functions

我正在使用Set中的CarCagetory

public struct Images {
    static let categoryTeaser = UIImage()
}

public enum PremiumModel {
    case model1, model2, model3, unknown 
}

public struct CarCategory {
    public let teaserImage: UIImage
    public let make: String
    public let model: PremiumModel
    public let startPrice: Double
}

// MARK: - Equatable
extension CarCategory: Equatable {
    public static func == (lhs: CarCategory, rhs: CarCategory) -> Bool {
        return lhs.model == rhs.model
    }
}

// MARK: - Hashable
extension CarCategory: Hashable {
    public var hashValue: Int {
        return model.hashValue
    }
}

我正在遍历一系列汽车,并根据模型提取一组类别:

var categories = Set<CarCategory>()

carSpecifications.forEach {
    if PremiumModel(rawValue: $0.car.model) != .unknown {    
        categories.insert(CarCategory(teaserImage: Images.categoryTeaser, make: $0.car.make, model: PremiumModel(rawValue: $0.car.model), startPrice: $0.pricing.price))
    }
}

这很好用。

现在,我想以特定型号的最低价格来更新我的Set。我正在考虑使用[PremiumModel: Double]字典,在该字典中我为模型保留了最低的价格,最后我相应地更新了Set,但我想知道是否有更好的方法。

编辑:

这是我当前使用字典的实现。感觉很初级...

carSpecifications.forEach {
    let model = PremiumModel(rawValue: $0.car.model)
    if model != .unknown {

        if let value = minPriceForModel[model] {
            minPriceForModel[model] = min(value, $0.pricing.price)
        } else {
            minPriceForModel[model] = $0.pricing.price
        }

        categories.insert(CarCategory(teaserImage: Images.categoryTeaser, make: $0.car.make, model: model, startPrice: $0.pricing.price))
    }
}

let sortedCategories = Array(categories.sorted(by: <))
    .compactMap { (category: CarCategory) -> CarCategory in
    var newCategory = category
    newCategory.startPrice = minPriceForModel[category.model] ?? 0
    return newCategory
}

return sortedCategories

0 个答案:

没有答案
相关问题