我有一个对象数组,每个对象都包含折扣率,我需要按照它们的速率对它们进行排序,
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.
任何想法怎么做?如果有一种方法可以在没有施法的情况下进行,那就更好了
答案 0 :(得分:2)
首先,您需要验证您开始使用的数组是否为[ShopDetails]
类型。该错误表明这可能是一个Objective-C NSArray
,它在Swift中不起作用。如果您对此不清楚,我建议您使用Google主题:没有理由在Swift中使用NSArray
。
下面,我假设数组是正确的类型([ShopDetails]
)。从这里开始,您还需要做两件事,因为discountRate
的类型为String?
。
Int
。考虑到这些因素,您的排序功能可能如下所示:
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而不是字符串,并且如果你不需要,则停止处理选项。