涉及到的知识点
- 获取一个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
)