根据一个属性排序数组

cas*_*las 2 objective-c ios

我有一个NSMutableArray被调用allItems,它有以下ProductData对象.

每个对象都有cid, cname, ctypecimage.如下所示,json对象没有按顺序排列.但是,cid是订购的指标.

我想知道您如何根据cid订购?

 [
  {
    "cid": "2",
    "cname": "Meats",
    "ctype": "main",
    "cimage": "baked_chicken.jpg"
  },
  {
    "cid": "1",
    "cname": "Dips",
    "ctype": "side",
    "cimage": "stuffed_eggplant.jpg"
  },
  {
    "cid": "4",
    "cname": "Sandwiches",
    "ctype": "sand",
    "cimage": "chickenshawarma.jpg"
  },
  {
    "cid": "3",
    "cname": "Appetizers",
    "ctype": "side",
    "cimage": "rice_lentils.jpg"
  },
  {
    "cid": "5",
    "cname": "Desserts",
    "ctype": "dsrt",
    "cimage": "cake.jpg"
  }]
Run Code Online (Sandbox Code Playgroud)

如果我使用它sortDescriptior,它部分工作.我面临的问题,当它排序时,它首先显示cid1然后显示cid10然后显示cid2.

NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"cid" ascending:YES];
[allItems sortUsingDescriptors:@[sortDescriptor]];
Run Code Online (Sandbox Code Playgroud)

vad*_*ian 7

使用带有比较器传递compare:options:和选项的排序描述符NSNumericSearch:

NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"cid" ascending:YES comparator:^(id obj1, id obj2) {
     return [obj1 compare:obj2 options:NSNumericSearch];
}];
Run Code Online (Sandbox Code Playgroud)

甚至更简单:

NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"cid" ascending:YES selector:@selector(localizedStandardCompare:)];
Run Code Online (Sandbox Code Playgroud)

localizedStandardCompare 是一个特殊的比较选择器:

只要文件名或其他字符串出现在适合类似Finder的排序的列表和表中,就应该使用此方法.在不同的语言环境下,此方法的确切排序行为是不同的,并且可能在将来的版本中进行更改.此方法使用当前区域设置.