搜索过滤器必须从[[String:Any]]()数组过滤到新的过滤阵列



我有一个 tableview,其中我从我命名为 PlaylistArray的数组中加载了所有详细信息。我有一个搜索页面,用户可以从playlistArray搜索哪个类型[[String: Any]]。我不知道如何过滤用户在PlayListArray中给出的搜索文本至filteredArray。我已将PlaylistArray响应附加了您的参考。

这是我之前尝试过过滤PlaylistArray的代码。

 let searchPredicate = NSPredicate(format: "SELF CONTAINS[c] %@", searchController.searchBar.text!)
 let array = (constantsList.playTypeArray.lectureArraymp3 as NSArray).filtered(using: searchPredicate)
          //  filtered_Array.add(array)
 print(array)

我需要搜索用户提供的搜索文本,我们必须将搜索文本与playlistArraytitle标签进行比较。当两者相同时,我需要向过滤的数组显示特定数组索引的全部详细信息。

PlayListArray:

[["title": Kaṭha-Bhāṣyam-41 Mantra 1-2-20, "image_url": https://www.imaginetventures.name/swamijione/wp-content/uploads/2019/01/gitanew.png, "mp3": https://www.imaginetventures.name/swamiji/wp-content/uploads/2018/12/01-PURU],["title": Kaṭha-Bhāṣyam-41 Mantra 1-2-20, "image_url": https://www.imaginetventures.name/swamijione/wp-content/uploads/2019/01/gitanew.png, "mp3": https://www.imaginetventures.name/swamiji/wp-content/uploads/2018/12/01-PURU],["title": Kaṭha-Bhāṣyam-41 Mantra 1-2-20, "image_url": https://www.imaginetventures.name/swamijione/wp-content/uploads/2019/01/gitanew.png, "mp3": https://www.imaginetventures.name/swamiji/wp-content/uploads/2018/12/01-PURU]]

这是用于使用filter API的Swift的解决方案。在此处阅读有关此信息的更多信息:https://developer.apple.com/documentation/swift/sequence/3018365-filter

let array = [["title": "Kaṭha-Bhāṣyam-41 Mantra 1-2-20", "image_url": "https://www.imaginetventures.name/swamijione/wp-content/uploads/2019/01/gitanew.png"],
             ["title": "Kaṭa-Bhāṣyam-41 Mantra 1-2-20", "image_url": "https://www.imaginetventures.name/swamijione/wp-content/uploads/2019/01/gitanew.png"]]
guard let searchText = searchController.searchBar.text else {return} //Or use if-let
let filteredArray = array.filter { (object) -> Bool in
    guard let title = object["title"] as? String else {return false}
    return title?.contains(searchText) ?? false
}

而不是使用词典数组使用构造数组。创建一个结构和结构实例

//Item
struct Item {
    var title: String
    var imageUrl: URL
    var mp3Url: URL
    init?(details: [String:Any]) {
        if let title = details["title"] as? String,
            let imageStr = details["image_url"] as? String,
            let imageUrl = URL(string: imageStr),
            let mp3Str = details["mp3"] as? String,
            let mp3Url = URL(string: mp3Str) {
                self.title = title
                self.imageUrl = imageUrl
                self.mp3Url = mp3Url
        } else { return nil }
    }
}

然后用标题属性过滤数组。

let playlistArray = [["title": "Kaṭha-Bhāṣyam-41 Mantra 1-2-20", "image_url": "https://...", "mp3": "https://..."],
                     ["title": "Kaṭha-Bhāṣyam-41 Mantra 1-2-20", "image_url": "https://...", "mp3": "https://..."],
                     ["title": "Kaṭha-Bhāṣyam-41 Mantra 1-2-20", "image_url": "https://...", "mp3": "https://..."]]
let playlistArr = playlistArray.compactMap(Item.init)
print(playlistArr)
let searchText = "Kar"//searchController.searchBar.text!
let filteredArray = playlistArr.filter({ $0.title.localizedCaseInsensitiveContains(searchText) })
print(filteredArray)

最新更新