通讯录好久好久没写 Swift,最近在用 Swift 写一个项目的时候,需要排序下通讯录和分组的,用了网友的 SCIndexView 索引 和 BMChineseSortSwift 排序 拼音排序后,很轻松了实现以下效果的
然而发现使用 BMChineseSortSwift
排序的时候,排序不对,于是尝试用 Swift 写下排序的:
func sortAddressList() {
if (self.dataArray?.count ?? 0 < 1) {
return
}
// 抽取首字母
var resultNames: [String] = [String]()
if let nameArray = self.dataArray?.map({ item -> String? in
if let name = item.realname {
let pinYin: String = name.transformToPinYin()
return pinYin.first?.description ?? ""
} else {
return ""
}
}).compactMap({$0}) {
let nameSet: NSSet = NSSet(array: nameArray)
for item in nameSet {
resultNames.append("\(item)")
}
}
// 排序, 同时保证特殊字符在最后
resultNames = resultNames.sorted(by: { (one, two) -> Bool in
if (one.isNotLetter()) {
return false
} else if (two.isNotLetter()) {
return true
} else {
return one < two
}
})
// 替换特殊字符
self.firstLetterArray.removeAll()
let special: String = "#"
for value in resultNames {
if (value.isNotLetter()) {
self.firstLetterArray.append(special)
break
} else {
self.firstLetterArray.append(value)
}
}
// 分组
self.sortedModelArr.removeAll()
for object in self.firstLetterArray {
if let people: [AddressListItemModel] = (self.dataArray?.filter { (dataModel) -> Bool in
if let pinYin = dataModel.realname?.transformToPinYin().first?.description {
if (pinYin.isNotLetter() && object == special) {
return true
} else {
return pinYin == object
}
} else {
return false
}
}.compactMap{$0}) {
self.sortedModelArr.append(people)
}
}
var indexArray: [String] = self.firstLetterArray
indexArray.insert(UITableView.indexSearch, at: 0)
self.tableView.sc_indexViewDataSource = indexArray
self.tableView.reloadData()
}
extension String {
func transformToPinYin() ->String {
let mutableString = NSMutableString(string: self)
CFStringTransform(mutableString, nil, kCFStringTransformToLatin, false)
CFStringTransform(mutableString, nil, kCFStringTransformStripDiacritics, false)
let string = String(mutableString)
return string.replacingOccurrences(of: " ", with: "").uppercased()
}
func isNotLetter()-> Bool {
let upperCaseStr: String = self.uppercased()
let c = Character(upperCaseStr)
if c >= "A", c <= "Z"{//
return false
} else {
return true
}
}
}
以上的实现就是实现,木有用到 Swift 一些优雅的写法和高级的使用,感觉以上代码吐槽点太多,但是这是前一段时间第一反应写下来的,还是记录下。
过段时间后,再回头看看自己 用 OC 思维写 Swift 的吐槽点了,也应该蛮有趣的
网友评论