Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在swift中组合多个搜索字段_Swift_Search_Filter_Contains - Fatal编程技术网

在swift中组合多个搜索字段

在swift中组合多个搜索字段,swift,search,filter,contains,Swift,Search,Filter,Contains,我有四个必须搜索和筛选的字段。我可以单独搜索,但现在我想合并所有4个字段并获得结果,然后重新加载集合视图 使用的数据模型如下所示: import Foundation // MARK: - Empty struct SearchDataModel: Codable,Equatable { static func == (lhs: SearchDataModel, rhs: SearchDataModel) -> Bool { return false

我有四个必须搜索和筛选的字段。我可以单独搜索,但现在我想合并所有4个字段并获得结果,然后重新加载集合视图

使用的数据模型如下所示:

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"
    }
}
let list1 = orgsearchDataModel?.data.filter { $0.listingAddress!.range(of: keyword!, options: .caseInsensitive) != nil }
let list2 = orgsearchDataModel?.data.filter { $0.listingType.range(of: type, options: .caseInsensitive) != nil }
   
let list3 = orgsearchDataModel?.data.filter { $0.listingUse.range(of: use, options: .caseInsensitive) != nil }
             
let list4 = orgsearchDataModel?.data.filter {
            if let price = Int($0.listingPrice ?? "0") {
                return (price > min! && price < max!)
            }
            return false
        }
搜索的字段包括listingprice、listingtype、listinguse、listingaddress

每个字段的搜索筛选器如下所示:

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"
    }
}
let list1 = orgsearchDataModel?.data.filter { $0.listingAddress!.range(of: keyword!, options: .caseInsensitive) != nil }
let list2 = orgsearchDataModel?.data.filter { $0.listingType.range(of: type, options: .caseInsensitive) != nil }
   
let list3 = orgsearchDataModel?.data.filter { $0.listingUse.range(of: use, options: .caseInsensitive) != nil }
             
let list4 = orgsearchDataModel?.data.filter {
            if let price = Int($0.listingPrice ?? "0") {
                return (price > min! && price < max!)
            }
            return false
        }
问题是它将
list1
list2
list3
组合在一起,并正确显示结果

let a = list1!.filter { list2!.contains($0) && list3!.contains($0) } 
,但当我也添加
list4
时,结果为零


有人能帮助我如何组合所有搜索并得到满足所有四个搜索字段的结果。

确认您的结构为Hashable并实现这些方法

struct Datum: Codable,Equatable, Hashable {
   func hash(into hasher: inout Hasher) {
        hasher.combine(userID)
        hasher.combine(name)
        hasher.combine(image)
        //Add other values too
    }
}

let result = Set(list1 ?? [])
    .intersection(list2 ?? [])
    .intersection(list3 ?? [])
    .intersection(list4 ?? [])

let array = Array(result)

您不需要合并4个列表。只需使用所有条件筛选1次。如何做到这一点?基本上我需要所有4个筛选结果的公共元素。可能是这样?可能列表4中的搜索已中断。@Larme使用哪一个?给出了两种方法不会影响顺序吗?是的,当向集合添加元素时,顺序不会保留。您需要根据什么标准对列表进行排序。@udbhateja您是在问我订单吗?@saranya更新了答案,请检查。