Фильтровать массив в Swift на основе нескольких свойств - PullRequest
0 голосов
/ 26 ноября 2018
struct User{
    var firstName:String
    var lastName:String
    var city:String
    var email:String
}

var users = [User]

Я пытаюсь фильтровать пользователей, когда кто-то печатает в текстовом поле.Это как поиск по электронной почте.Он должен показывать все совпадающие результаты, но не должен дублировать одного и того же пользователя.Я могу фильтровать массив по одному свойству, например name, но не уверен, как фильтровать массив по всем свойствам.

Я реализовал делегат UITextField и имею этот код для фильтрации.

let filteredArray = users.filter({ (user) -> Bool in
    return user.firstName.lowercased().contains(“John”)
})

Ответы [ 3 ]

0 голосов
/ 26 ноября 2018
let filteredArray = users.filter({ $0.firstName.lowercased().contains("firstName") || $0.lastName.lowercased().contains("lastName") || ... })
0 голосов
/ 26 ноября 2018

Поскольку вам, вероятно, понадобится выполнить поиск по нескольким вещам, я бы порекомендовал вам создать протокол Searchable и сделать поиск агрегатных типов за счет проверки, совпадает ли какая-либо из их составляющих.

import Foundation

struct User {
    let firstName: String
    let lastName: String
    let city: String
    let email: String
    let age: Int // an example of a non-String type.
}

protocol Searchable {
    func matches(query: String) -> Bool 
}

extension String: Searchable {
    func matches(query: String) -> Bool {
        // Implement any kind of searching algorithm here. Could be as smart as fuzzy seraching
        // or as basic as this case-insenitive simple substring search
        return self.lowercased().contains(query)
    }
}

extension Int: Searchable {
    func matches(query: String) -> Bool {
        return String(self).matches(query: query)
    }
}


extension User: Searchable {
    func matches(query: String) -> Bool {
        let constituents: [Searchable] = [firstName, lastName, city, email, age]
        return constituents.contains(where: { $0.matches(query: query) })
    }
}
0 голосов
/ 26 ноября 2018

Вы можете установить несколько условий и объединить их вместе с помощью ИЛИ (||) или И (&&) - это простое логическое значение, вы можете думать об этом так, как это было в операторе if-

if user.firstName.lowercased().contains("john") || user.lastName.lowerCased().contains("lastname") { return true }
else { return false }

так в вашем коде это будет похоже на

let filteredArray = users.filter { (user) -> Bool in
return user.firstName.lowercased().contains("john") || user.lastName.lowercased().contains("lastname") }
...