比较器NSComparator的使用和数组排序

涉及到的知识点

  • 获取一个model类的所有property列表
  • 获取这些property的类名
  • NSString的排序使用
  • 数组的排序使用方式

实例描述

将后台发来的json entity转译成一个model类。将所有的类名和类对应的值组成一个长的字符串,所有的property变成字符串,并按自然顺序排列。然后组成一个长字符串如:"key1=value1&key2=value2&...."

这里略去 JSON -> Model class的流程

NSString的排序

  • 比较的方法:
[value compare:(NSString *)];
[value compare:(NSString *) options:(NSStringCompareOptions)];
[value compare:(NSString *) options:(NSStringCompareOptions) range:(NSRange)];
  • 传入的参数:
    compare:(NSString *)
    传入一个需要比较的字符串。
    例如 [value compare:@"1234567890"],返回 NSOrderedSame。
    options:(NSStringCompareOptions)
  • 传入 NSStringCompareOptions 枚举的值
enum{
    NSCaseInsensitiveSearch = 1,//不区分大小写比较
    NSLiteralSearch = 2,//区分大小写比较
    NSBackwardsSearch = 4,//从字符串末尾开始搜索
    NSAnchoredSearch = 8,//搜索限制范围的字符串
    NSNumbericSearch = 64//按照字符串里的数字为依据,算出顺序。例如 Foo2.txt < Foo7.txt < Foo25.txt
//以下定义高于 mac os 10.5 或者高于 iphone 2.0 可用
    ,
    NSDiacriticInsensitiveSearch = 128,//忽略 "-" 符号的比较
    NSWidthInsensitiveSearch = 256,//忽略字符串的长度,比较出结果
    NSForcedOrderingSearch = 512//忽略不区分大小写比较的选项,并强制返回 NSOrderedAscending 或者 NSOrderedDescending
//以下定义高于 iphone 3.2 可用
    ,
    NSRegularExpressionSearch = 1024//只能应用于 rangeOfString:..., stringByReplacingOccurrencesOfString:...和 replaceOccurrencesOfString:... 方法。使用通用兼容的比较方法,如果设置此项,可以去掉 NSCaseInsensitiveSearch 和 NSAnchoredSearch
}
  • range:(NSRange)
    比较字符串的范围
    结构变量:
    location: 需要比较的字串起始位置(以0为起始)
    length: 需要比较的字串长度

  • 返回值:

typedef enum _NSComparisonResult {
     NSOrderedAscending = -1,    // < 升序
     NSOrderedSame,              // = 等于
     NSOrderedDescending   // > 降序
} NSComparisonResult;

代码

  • 获取model 的property名,存在一个数组里。使用runtime
unsigned int count;// 记录属性个数
objc_property_t *properties = class_copyPropertyList([TestModel class], &count);
// 生成一个属性名称组成的数组
NSMutableArray *propertyNameArray = [NSMutableArray array];
for (int i = 0; i < count; i++) {
    // An opaque type that represents an Objective-C declared property.
    // objc_property_t 属性类型
    objc_property_t property = properties[i];
    // 获取属性的名称 C语言字符串
    const char *cName = property_getName(property);
    // 转换为Objective C 字符串
    NSString *name = [NSString stringWithCString:cName encoding:NSUTF8StringEncoding];
    [propertyNameArray addObject:name];
}
NSLog(@"排序前的属性列表 = %@",propertyNameArray);
  • 使用比较器设定排列顺序
NSComparator cmptr = ^(NSString *obj1, NSString *obj2){
    return [obj1 compare:obj2 options:NSLiteralSearch];
};
NSArray *afterSort = [propertyNameArray sortedArrayUsingComparator:cmptr];
NSLog(@"排序后的属性列表 = %@",afterSort);

打印出排序前后的日志对比:

2016-07-09 17:13:49.956 SortMyProperty[90373:4208586] 排序前的属性列表 = (
accessToken,usrType,usrStatus,enabled,mrchNo,mrchName,storeNo,storeName,hasLogin,operatorName,transferChannel,canRemit,canIncome,canUpgrade,isSetSecurityQuestion,isSupportCashConsume,serverBankUpdTime,signData
)
2016-07-09 17:13:49.957 SortMyProperty[90373:4208586] 排序后的属性列表 = (
accessToken,canIncome,canRemit,canUpgrade,enabled,hasLogin,isSetSecurityQuestion,isSupportCashConsume,mrchName,mrchNo,operatorName,serverBankUpdTime,signData,storeName,storeNo,transferChannel,usrStatus,usrType
)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容