搜索过滤器以获取 swift 中两个数字之间的值
search filter to fetch values between two numbers in swift
我有一个包含 values.The 模型集的数据模型如下:
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"
}
}
现在基于属性 listingprice,我想搜索和过滤 data.The 价格在文本字段中输入为两个值,表示开始和结束 number.The 价格落在这两个数字之间过滤并重新加载表格视图。
我用来过滤价格的逻辑如下:
let price = orgsearchDataModel?.data.filter{[=12=].listingPrice! > self.minPrice.text! && [=12=].listingPrice! < self.maxPrice.text!}
for items in 0..<price.count{
self.searchidArray.append(self.searchDataModel!.data[items].id)
}
self.alllistcollview?.reloadData()
此语句抛出错误 nil.How 以在两个数字之间进行过滤并重新加载表格视图。
根据您的要求将String转换为Int或Double,然后从数组中过滤数据
guard
let min = Int(minPrice.text ?? "0"),
let max = Int(maxPrice.text ?? "0") else {
return
}
let results = data.filter({
if let price = Int([=10=].listingPrice ?? "0") {
return (price > min && price < max)
}
return false
})
//将结果赋给tableView数据源并重新加载tableView。
所有值都需要转换为 Int 或 Double,我这里假设它是 Double,因为这对于价格来说更正常。
您需要考虑到标价可能为零,而且用户没有同时输入最低价和最高价或输入了非数字的内容。例如,一个空的最大字段意味着我们不应该过滤最高价格。
//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([=10=].listingPrice) else { return false }
return (minLimit == nil || price >= minLimit!) &&
(maxLimit == nil || price <= maxLimit!)
}
然后我真的不明白你对结果做了什么以及为什么你不能直接使用它但是如果你需要映射到 id
那么这应该做
self.searchidArray = items.map(\.id)
我有一个包含 values.The 模型集的数据模型如下:
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"
}
}
现在基于属性 listingprice,我想搜索和过滤 data.The 价格在文本字段中输入为两个值,表示开始和结束 number.The 价格落在这两个数字之间过滤并重新加载表格视图。
我用来过滤价格的逻辑如下:
let price = orgsearchDataModel?.data.filter{[=12=].listingPrice! > self.minPrice.text! && [=12=].listingPrice! < self.maxPrice.text!}
for items in 0..<price.count{
self.searchidArray.append(self.searchDataModel!.data[items].id)
}
self.alllistcollview?.reloadData()
此语句抛出错误 nil.How 以在两个数字之间进行过滤并重新加载表格视图。
根据您的要求将String转换为Int或Double,然后从数组中过滤数据
guard
let min = Int(minPrice.text ?? "0"),
let max = Int(maxPrice.text ?? "0") else {
return
}
let results = data.filter({
if let price = Int([=10=].listingPrice ?? "0") {
return (price > min && price < max)
}
return false
})
//将结果赋给tableView数据源并重新加载tableView。
所有值都需要转换为 Int 或 Double,我这里假设它是 Double,因为这对于价格来说更正常。
您需要考虑到标价可能为零,而且用户没有同时输入最低价和最高价或输入了非数字的内容。例如,一个空的最大字段意味着我们不应该过滤最高价格。
//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([=10=].listingPrice) else { return false }
return (minLimit == nil || price >= minLimit!) &&
(maxLimit == nil || price <= maxLimit!)
}
然后我真的不明白你对结果做了什么以及为什么你不能直接使用它但是如果你需要映射到 id
那么这应该做
self.searchidArray = items.map(\.id)