美文网首页
Swift 实现通讯录分组和排序

Swift 实现通讯录分组和排序

作者: 天空中的球 | 来源:发表于2021-08-17 16:55 被阅读0次

好久好久没写 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 的吐槽点了,也应该蛮有趣的

相关文章

网友评论

      本文标题:Swift 实现通讯录分组和排序

      本文链接:https://www.haomeiwen.com/subject/stjibltx.html