Blame view

Twear/Tools/BMChineseSort.swift 2.66 KB
582f536d   yangbin   common:2022.1.28
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
  //
  //  BMChineseSort.swift
  //  
  //
  //  Created by Baymax on 2018/10/29.
  //  Copyright © 2018 Baymax. All rights reserved.
  //
  
  import Foundation
  
  /// 开放的两个方法
  public protocol BMChineseSortProtocol {
      
      /// 中文对应拼音  eg:"Ad钙奶" -> "Ad gai nai"  结果英文不变 拼音小写
      ///
      /// - Parameter word: 中文字符串
      /// - Returns: 拼音
      static func transformChinese(_ word:String) -> String
      
      /// 排序
      ///
      /// - Parameters:
      ///   - objectArray: 需要排序的数组
      ///   - key: 需要排序的字段字符串数组传nil
      ///   - finish: 排序后回调
      static func sortAndGroup<T>( objectArray:Array<T>?,
                                   key:String?,
                                   finish: @escaping (_ success:Bool, _ unGroupedArr:Array<T>, _ sectionTitleArr:Array<String>, _ sortedObjArr:Array<Array<T>>) ->() )
  }
  
  /// 排序的拼音比较类型枚举
  public enum BMChineseSortType {
      /// 全拼音
      case fullPinyin
      /// 拼音首字母
      case initial
  }
  
  /// 默认属性修改 通过BMChineseSort.share().property = ** 修改
  public class BMChineseSort {
      
      //    sortMode = 1 使用原生CFStringTransform 方法转换比较耗时全拼音必须使用此设置
      //    sortMode = 2 使用汉字码表对应的首字母码表 通过编码顺序查找 比较快
      //    码表来源于网络 不保证准确性除了多音字没发现有错误),可以码表配合polyphoneMapping手动修改想要的映射
      /// 转拼音的方式 默认 用码表
      public var sortMode:Int = 2
      
      /// 默认比较首字母 如果用 fullPinyin sortMode强制为1 因为码表仅为首字母
      public var compareTpye:BMChineseSortType = .initial
  
      /// 是否打印所用时间
      public var logEable:Bool = false
      
      /// 特殊字符最后单独分组所用的 分组名称
      public var specialCharSectionTitle: String = "#"
      
      /// 特殊字符所在 位置 YES = 开头NO = 结尾
      public var specialCharPositionIsFront: Bool = false
      
      /// 剔除 特定字符开头的对象不出现在最终结果集中 不要与 specialCharSectionTitle 冲突
      /// eg: 过滤所有数字开的对象  ignoreModelWithPrefix = "0123456789"
      public var ignoreModelWithPrefix: String = ""
      
      /// 手动映射多音字key = 中文value = 对应首字母
      public var polyphoneMapping = ["重庆":"CQ",
                              "厦门":"XM",
                              "长":"C",
                              "沈":"S",]
      
      public static var share: BMChineseSort = BMChineseSort()
      
      // 信号量
      var semaphore = DispatchSemaphore(value: 1)
  }