Swift 在名称数组中添加类似通讯簿的字母

Swift 在名称数组中添加类似通讯簿的字母,swift,nsarray,Swift,Nsarray,我试着将一组人(现在简化为一个名字)进行排序,不仅对其进行排序,还将第一个字母添加到所有人面前,以这个字母开头 基本上这个:[“丹尼尔”、“迈克尔”、“丽莎”、“莉娜”]应该变成这个:[“D”、“丹尼尔”、“L”、“莉娜”、“丽莎”、“M”、“迈克尔”] 我有一些东西在操场上工作,但对我来说,这看起来像地狱一样难看,不知道如果人们得到成千上万或更多 //: Playground - noun: a place where people can play import Cocoa var pr

我试着将一组人(现在简化为一个名字)进行排序,不仅对其进行排序,还将第一个字母添加到所有人面前,以这个字母开头

基本上这个:[“丹尼尔”、“迈克尔”、“丽莎”、“莉娜”]应该变成这个:[“D”、“丹尼尔”、“L”、“莉娜”、“丽莎”、“M”、“迈克尔”]

我有一些东西在操场上工作,但对我来说,这看起来像地狱一样难看,不知道如果人们得到成千上万或更多

//: Playground - noun: a place where people can play

import Cocoa

var previousName: String?

let people = ["Martin", "Michael", "Lisa", "Lena", "Dirk"]
var peopleWithLetters: [String] = []

people.sorted { $0.localizedCaseInsensitiveCompare($1) == ComparisonResult.orderedAscending }.forEach {
    if $0.uppercased().characters.first! != previousName?.uppercased().characters.first! {
        peopleWithLetters.append("\($0.uppercased().characters.first!)")
    }
    previousName = $0
    peopleWithLetters.append($0)
}

任何关于如何简化或遵循最佳实践的想法都将受到高度赞赏。

这是函数式编程的完美案例

  • 将名称数组映射到首字母数组
  • 使用集合删除重复项
  • 把字母和名字结合起来
  • 对数组进行排序
代码如下:

//: Playground - noun: a place where people can play

func addSections(in words: [String]) -> [String] {
    let sections = Set(words.map { String($0[$0.startIndex]) })
    let wordsWithSections = words + sections
    return wordsWithSections.sorted { $0 < $1 }
}

let names = ["Daniel", "Michael", "Lisa", "Lena"]
addSections(in: names)
/:操场-名词:人们可以玩耍的地方
func addSections(大写:[String])->[String]{
let sections=Set(words.map{String($0[$0.startIndex]))
让wordsWithSections=单词+部分
返回单词swithSections.sorted{$0<$1}
}
让名字=[“丹尼尔”、“迈克尔”、“丽莎”、“莉娜”]
添加节(在:名称中)

虽然如果您计划使用此数组来提供表格视图(节/行),但最好使用您在评论中提到的字典。

使用Swift时,“丑得要命”似乎是正确的方法。SCNR添加字母和排序。有趣的想法!但是需要去掉那些没有名字的字母。我检查了新的Swift 4语法,发现了一种使用“分组依据”初始化词典的新方法,这基本上起到了作用。