过滤字典内的数组 - Swift

2024-01-01

我正在尝试搜索索引字典以根据客户的姓氏返回特定客户。以下是我正在使用的数据结构。每个客户端对象都有一个名称属性,它是一个字符串。

var clients = Client.loadAllClients()     //Returns client array
var contacts = [String: [Client]]()      //Indexed clients in a dictionary 
var letters: [String] = [] 

var filteredClient = [Client]()
var shouldShowSearchResults = false
var searchController : UISearchController!   

当我进行索引时,联系人字典返回:

{A: [Client("Andrew")]}

字母数组返回:

[A]

我正在使用 UISearchController 来显示过滤后的客户端数组。

func updateSearchResults(for searchController: UISearchController) {
    // how to filter the dictionary 
    self.tableView.reloadData()
}

但是,我不知道如何过滤字典以返回正确的客户列表。我尝试过使用

contacts.filter(isIncluded: ((key: String, value: [Client])) throws -> Bool((key: String, value: [Client])) throws -> Bool)

但我对实施感到非常困惑。我正在使用 Xcode 8.0 和 Swift 3.0。

如果有人能指出我正确的方向,我将不胜感激。如果我需要澄清任何事情,请告诉我。先感谢您。完整的代码可以在我的Github https://github.com/brandenk514/iKennel/blob/master/iKennel/ClientTableViewController.swift


主要问题是你正在使用字典作为数据源array.

我的建议是使用自定义结构作为模型

struct Contact {
   let letter : String
   var clients : [Client]

   init(letter: String, clients : [Client] = [Client]()) {
      self.letter = letter
      self.clients = clients
   } 

   mutating func add(client : Client) {
        clients.append(client)
   }
}

然后创建您的数据源数组

var contacts = [Contact]()  

和字母数组作为计算属性

var letters : [String] = {
   return contacts.map{ $0.letter }
}

按字母对数组进行排序很容易

contacts.sort{ $0.letter < $1.letter }

现在您可以通过这种方式搜索/过滤(text是要搜索的文本)

 filteredClient.removeAll()
 for contact in contacts {
     let filteredContent = contact.clients.filter {$0.name.range(of: text, options: [.anchored, .caseInsensitive, .diacriticInsensitive]) != nil }
     if !filteredContent.isEmpty {
         filteredClient.append(filteredContent)
     }
 }

如果您声明,您甚至可以保留这些部分(字母)filteredClient也作为[Contact]并创建临时的Contact包含已过滤项目的实例。

当然,您需要更改所有表视图数据源/委托方法以符合Contact数组,但这是值得的。数组作为数据源比字典更有效。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

过滤字典内的数组 - Swift 的相关文章

随机推荐

  • 是否可以在使用sql的更新语句中使用MAX?

    我正在尝试在sql语句中使用MAX函数 这就是我想做的 像这样的东西 UPDATE MainTable SET Date GETDATE where ID Max 我知道这是错误的 特别是在我放置 where 条件但无法弄清楚如何在同一语句
  • 在 Google Analytics iOS SDK v3 中设置用户性别和年龄

    使用最新的Google Analytics SDK v3 0 6 我在文档中找不到任何地方 通过头文件搜索或网络搜索如何设置当前用户的年龄和性别以进行GA跟踪 我成功地将自定义维度用于其他事情 并且可以将其中两个用于年龄和性别 但当已经有年
  • Firebase 数据库带宽计算

    两周前 我发布了一款名为 MyPetrol 的 Android 应用程序 三天之内 马来西亚就有大约 9 万用户 之后 由于 Firebase 数据库带宽消耗巨大 3 天 117GB 我关闭了该应用程序 我是一个自学成才的爱好者 没有IT相
  • android playstore支持非续订订阅吗?

    我的问题是我们可以在我们的 Android 应用程序中提供非续订订阅的功能吗 因此 用户将通过邮件收到他 她的订阅已过期的通知 因此他将像 IOS 一样手动重新订阅 是的 它确实 参见Android官方文档的描述 您可以创建关联的数字商品的
  • 当我第一次获取 nginx 时发生错误 CORS/503 [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 这与我之前的问题有关从这里 https stackoverflow com questions 75287786 cor
  • 在 java 8 中迭代和映射两个列表

    我有 2 个清单 列表1 对象1 名称1 id1 列表2 对象2 名称2 id2 假设 list1 的大小与 list2 相同 我想迭代列表 2 如果列表 2 的名称不为空 则更新列表 1 的名称 1 这是使用旧java的代码 for Ob
  • 在 React Native 的 onPress 事件期间 this.state 未定义

    你好 我是 React Native 的新手 我的代码是 import React View Text TextInput Component from react native import Style from styles signi
  • 使用 iTextSharp 编辑现有 PDF 文件

    我有一个 pdf 文件 我正在通过使用以下编码将其转换为文本来处理它 ITextExtractionStrategy strategy new SimpleTextExtractionStrategy string currentText
  • MySQL 从流读取失败

    我间歇性地面临以下错误 通过在 mysql 服务器设置中使用 跳过名称解析 选项可以解决此问题 但是 根据网上发现的许多建议 使用 127 0 0 1 应该可以解决该问题 但这也没有帮助 您能否建议我一个解决方法或一个 SQL 命令 通过它
  • 文件描述符规范

    我试图理解文件描述符的标志和模式 手册页 http man7 org linux man pages man2 fcntl 2 html for fcntl manipulate file descriptor int fcntl int
  • Neo4j 关系索引 - 搜索关系属性

    我有一个具有以下结构的 neo4j 图 账户 交易 账户 Transaction是neo4j关系 Account是节点 每笔交易都设置了各种属性 例如交易 ID 金额 日期和各种其他银行信息 我可以按帐户 ID 运行搜索 结果返回正常 但是
  • 如何防止 iPhone 屏幕在应用程序运行时变暗或关闭?

    我正在开发一个不需要用户输入的应用程序 但我不希望 iPhone 进入省电模式 是否可以通过应用程序禁用省电功能 Objective C UIApplication sharedApplication setIdleTimerDisable
  • Kendo Ui 下拉列表集通过 Javascript 可见

    我需要在 javaScript 中以编程方式设置可见的kendo dropdownlist 我曾尝试过 dropdownlist ddl data kendoDropDownList dropdownlist visible false d
  • 按因子级别拆分数据帧并按这些级别命名数据帧

    我想按因子变量之一的级别拆分现有数据帧 以便拆分数据帧的名称与因子的级别相对应 df lt data frame cbind X 1 10 Y rnorm 10 Z sample LETTERS 1 3 10 replace TRUE If
  • 使 div 自动向左而不是向右扩展宽度

    我的网站上有一个 div 其中包含充当菜单的项目列表 我已经设置了CSSwidth auto这样 如果菜单项太长 它会重新调整大小 但目前 这将扩展到右侧 并将我的其余内容 推 到右侧 这很难解释 所以举个例子 如果你去http redsq
  • C 中 _Bool 和 bool 类型之间的区别?

    谁能解释一下两者之间有什么区别 Bool and boolC 中的数据类型 例如 Bool x 1 bool y true printf d x printf d y 这些数据类型是在 C99 中添加的 自从bool在 C99 之前没有保留
  • 如何在 Sails js (nodejs MVC) 中使用外部 REST API

    我正在使用 sails js 作为 Node js 的 MVC 我仍在学习它 我设法从自己的数据库中获取数据并使用它 但现在我需要 想要从外部 REST API 获取数据 我在我的控制器中使用了这个 api controllers Some
  • C++ 的首选命名约定是什么?

    通过查看 boost 库和 stl 然后查看人们的示例 我感到非常困惑 看起来大写的类型名称都散布在所有小写字母中 并用下划线分隔 如今 事情到底应该怎样做呢 我知道 NET 世界有自己的一套约定 但它似乎与 C 领域完全不同 你打开了一个
  • 监听来自 Dart 的 javascript 事件

    Dart 有没有办法监听 javascript 库中的事件 例如 jqrangesliderhttp ghusse github io jQRangeSlider http ghusse github io jQRangeSlider 当有
  • 过滤字典内的数组 - Swift

    我正在尝试搜索索引字典以根据客户的姓氏返回特定客户 以下是我正在使用的数据结构 每个客户端对象都有一个名称属性 它是一个字符串 var clients Client loadAllClients Returns client array v