Я хотел воспользоваться возможностью, чтобы рассказать вам, что происходит, чтобы вы могли продолжать учиться и укреплять свои навыки. Итак, проблема в том, что ваш метод searchBar(_ textDidChange:...)
не фильтрует ожидаемый вами способ. Особенно этот блок кода.
currentClientDetails = clientDetails.filter({ client -> Bool in
switch searchBar.selectedScopeButtonIndex {
case 0:
if searchText.isEmpty { return true }
return client.CLNT_FULLNAME.lowercased().contains(searchText.lowercased())
default:
return false
}
})
Есть две возможные причины, по которым это ничего не дает. Причина # 1, ваш client.CLNT_FULLNAME
возвращает ""
или ваш метод всегда возвращает false, потому что первый элемент - ""
или нажатие default:
, которое возвращает false.
На основании предоставленного вами кода client
никогда не упорядочивается. Это означает, что каждый раз, когда срабатывает метод searchBar(_ textDidChange:...)
, это всегда одно и то же, никогда не меняется внутри вашего замыкания. Итак, чтобы исправить это, давайте разберем решение.
Решение
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
currentClientDetails = clientDetails.filter({ $0.CLNT_FULLNAME.contains(searchText) })
clientsTableView.reloadData()
}
Итак, что происходит внутри этого замыкания против того, что у вас есть? Что именно делает .filter()
, и как работает это закрытие? Существует две версии .filter()
, и в вашем случае вы используете последовательное замыкание. Это означает, что он вернет [object]
на основе данного предиката (формула).
Что такое предикат, данный здесь, и что это за фантазия $0
вообще? Предикат, указанный в .filter()
, проверяет каждый элемент в [object]
и возвращает истину или ложь для каждого элемента. True, если он содержит некоторые или все совпадения, или false, если нет. Как только замыкание завершается или sequence завершается, оно возвращает заданный объект. В вашем случае это выглядит как [client]
.
Мне нравится рассматривать метод .filter()
как разновидность for _ in 0..X
l oop, и это важная концепция, которую следует учитывать при использовании вышеупомянутых $0
необычных вещей. По сути, $0
говорит первый элемент в последовательности по сравнению с чем? или client[0]
по сравнению с чем. Это будет начальная последовательность, и она будет продолжаться до тех пор, пока последовательность не будет завершена, то есть число for _ in 0...X.count
.
Я надеюсь, что это даст вам возможность подумать и позволит продолжить кодирование. Спасибо за размещение вдумчивого вопроса и активное участие в работе над проблемой.