假设我有3个标题 - "A"
,"B"
和"C"
。
我有一个像这样的字符串数组,它们的名称和数量一直在变化 -
["A 483", "A 736", "B 673", "C 524", "C 245", "C 974"]
我希望我的数组中以A
开头的每个字符串都位于"A"
标题下,一个以B
开头的字符串进入"B"
标题,依此类推。
答案 0 :(得分:2)
使用此功能(如果您想查看它的功能,可以将此代码放在Playground中):
let nameQuantity = ["A 113", "B 123", "C 133", "D 143", "C 153", "D 163", "B 173", "C 183"]
let lettersToNameQuantity = nameQuantity.reduce([:]) { (result: [String: [String]], next: String) -> [String: [String]] in
var newResult = result
if let c = next.characters.first {
let firstLetter = String(c)
if let _ = newResult[firstLetter] {
newResult[firstLetter]!.append(next)
} else {
newResult[firstLetter] = [next]
}
}
return newResult
}
let numSections = lettersToNameQuantity.count
let numRowsInC = lettersToNameQuantity["C"]?.count
let rowsInC = lettersToNameQuantity["C"]
let sortedKeys = lettersToNameQuantity.keys.sorted()
lettersToNameQuantity
将如下所示:
["B": ["B 123", "B 173"],
"A": ["A 113"],
"C": ["C 133", "C 153", "C 183"],
"D": ["D 143", "D 163"]]
您可以使用它来实现表的数据源。密钥不按排序顺序排列,因此请务必使用sortedKeys
确定哪个部分是哪个字母。
答案 1 :(得分:0)
您可以使用Dictionary对数组进行分组,然后在tableView中按部分分隔。
func groupedItems () -> [String : [String]]{
let test = ["A 483", "A 736", "B 673", "C 524", "C 245", "C 974"];
var grouped = [String : [String]]();
for item in test {
let prefix = item.components(separatedBy: " ")[0]
//or let value = item (to include the whole string)
let value = item.components(separatedBy: " ")[1]
if var list = grouped[prefix] {
list.append(value)
grouped[prefix] = list
} else {
grouped[prefix] = [value]
}
}
return grouped
}
使用:强>
lazy var grouped : [String : [String]] = self.groupedItems()
.
.
.
.
func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
return Array(self.grouped.keys)[section]
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
let key = Array(self.grouped.keys)[section]
let values = self.grouped[key]
return values!.count
}
func numberOfSections(in tableView: UITableView) -> Int {
return Array(self.grouped.keys).count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
var cell : UITableViewCell? = tableView.dequeueReusableCell(withIdentifier: "identifier")
if cell == nil {
cell = UITableViewCell(style: .default, reuseIdentifier: "identifier")
}
let key = Array(self.grouped.keys)[indexPath.section]
let values = self.grouped[key]
cell?.textLabel?.text = values?[indexPath.row]
return cell!
}
<强>结果:强>