J'ai un modèle de données avec un ensemble de valeurs, le modèle est le suivant:

import Foundation

// MARK: - Empty
struct SearchDataModel: Codable,Equatable {
    
    static func == (lhs: SearchDataModel, rhs: SearchDataModel) -> Bool {
        return false
    }
    
    let status: Int
    var data: [Datum]
}

// MARK: - Datum
struct Datum: Codable,Equatable {
    let userID: Int
    let name: String
    let image: String?
  //  let image: JSONNull?
    let userAddress: String?
    let id: Int
    let listingImage: String?
    let listingVideo: String?
    let listingTitle: String
    let listingAddress: String?
    let listingPrice: String?
    let listingType: String
    let listingUse: String
    let listingSqft: String?
    let listingBedsCount, listingBathsCount, listingParkingSpot: Int?
    let listingDescription: String
    let featureListing: Int
    let createdAt, updatedAt: String

    enum CodingKeys: String, CodingKey {
        case userID = "user_id"
        case name, image
        case userAddress = "user_address"
        case id
        case listingImage = "listing_image"
        case listingVideo = "listing_video"
        case listingTitle = "listing_title"
        case listingAddress = "listing_address"
        case listingPrice = "listing_price"
        case listingType = "listing_type"
        case listingUse = "listing_use"
        case listingSqft = "listing_sqft"
        case listingBedsCount = "listing_beds_count"
        case listingBathsCount = "listing_baths_count"
        case listingParkingSpot = "listing_parking_spot"
        case listingDescription = "listing_description"
        case featureListing = "feature_listing"
        case createdAt = "created_at"
        case updatedAt = "updated_at"
    }
}

Maintenant, basé sur l'attribut listingprice, je veux rechercher et filtrer les données.Le prix est entré dans le champ de texte comme deux valeurs qui indiquent le nombre de début et de fin.Le prix tombant entre ces deux nombres doit filtrer et recharger la tableview.

La logique que j'ai utilisée pour filtrer le prix est la suivante:

let price = orgsearchDataModel?.data.filter{$0.listingPrice! > self.minPrice.text! && $0.listingPrice! < self.maxPrice.text!}

 for items in 0..<price.count{
                    self.searchidArray.append(self.searchDataModel!.data[items].id)
                    
                }

 self.alllistcollview?.reloadData()

Cette instruction renvoie une erreur comme nil. Comment filtrer entre deux nombres et recharger la vue de table.

0
saranya 27 oct. 2020 à 17:54

2 réponses

Meilleure réponse

Convertissez String en Int ou Double en fonction de vos besoins, puis filtrez les données du tableau

guard
    let min = Int(minPrice.text ?? "0"),
    let max = Int(maxPrice.text ?? "0") else {
    return
}

let results = data.filter({
    if let price = Int($0.listingPrice ?? "0") {
        return (price > min && price < max)
    }
    return false
})

// Affecte le résultat à la source de données tableView et recharge la tableView.

1
udbhateja 28 oct. 2020 à 11:32

Toutes les valeurs doivent être converties en Int ou Double, j'ai supposé que c'était Double ici car c'est plus normal pour un prix.

Vous devez tenir compte du fait que le prix catalogue peut être nul, mais aussi que l'utilisateur n'a pas entré à la fois le minimum et le maximum ou n'a pas entré quelque chose qui n'est pas un nombre. Un champ max vide, par exemple, signifie que nous ne devons pas filtrer pour un prix max.

//Convert values given by user, might result in a nil value
let minLimit = Double(minPrice.text!) 
let maxLimit = Double(maxPrice.text!)

//First check that list price is valid and if so ignore this item
//Then if limit is nil approve item or filter agains price for both min and max
let items = data.filter {
    guard let price = Double($0.listingPrice) else { return false }
    return (minLimit == nil || price >= minLimit!) &&
        (maxLimit == nil || price <= maxLimit!)
}

Ensuite, je ne comprends pas vraiment ce que vous faites avec le résultat et pourquoi vous ne pouvez pas l'utiliser directement, mais si vous devez faire le mappage vers id, alors cela devrait faire

self.searchidArray = items.map(\.id)
0
Joakim Danielson 28 oct. 2020 à 08:45