我创建了一个名为Contact的结构体,它代表一个人类联系人,目前有一些在数组中。他们已经按字母顺序排序,但我想按照名字属性(一个字符串)按字母顺序对它们进行排序,但我不仅想将它们按顺序放在单个数组中,我还想将对象拆分成不同的集合,这些集合与它们的名称的第一个字母相对应。例如,“A”包含两个对象,其中一个联系人的姓名以A开头,“B”用于像Bobby、Brad等名字……依此类推。
let contactData:[Contact] = [
Contact(id: 1, available: true, name: "Adam"),
Contact(id: 2, available: true, name: "Adrian"),
Contact(id: 3, available: true, name: "Balthazar"),
Contact(id: 4, available: true, name: "Bobby")
]
我想创建类似的东西
let sectionTitles = ["A", "B"]
let sortedContactData = [
[
Contact(name: "Adam"),
Contact(name: "Adrian")
],
[
Contact(name:"Balthazar")
Contact(name:"Bobby")
]
]
或者类似的东西...
最终结果是我想将它们显示到一个UITableView中,字母在Sections中,对象在indexPath.rows中,就像iPhone本地的联系人应用程序一样。实际上,我不确定是否这是实现此结果的最理想方式,所以欢迎对此问题提出任何挑战!
where SubSequence : Collection, SubSequence.Iterator.Element == Iterator.Element, SubSequence.Index == Index
,以让编译器知道:1)您可以在子序列上使用index(where:)
方法;2)子序列的元素与主集合相同(因此可以使用谓词);3)返回的索引是相同的索引类型。尽管值得注意的是,子序列具有与集合相同的索引类型并不一定保证子序列索引值对应于集合的索引值。 - Hamishindex(after: i)
,这可能会导致空集合崩溃 - 相反,您可以推迟j
的初始化,例如var j: Index
,然后在赋值时使用j = self[index(after: i)..<endIndex].index(where: ...)
(以防止第一个满足谓词的元素产生无限循环)。现在使用index(after:)
是安全的,因为我们知道i
不是endIndex
。 - HamishCollection
的语义要求,因此您的实现应该没问题。 - Hamish