Вы говорите, что объекты в массиве имеют свойство City, Name и Country, но также и свойство словаря, и вы хотите отсортировать по одному из ключей в словаре? Или вы говорите, что записи в массиве являются словарями, но иногда отсутствует ключ города, имени или страны? Или вы говорите, что некоторые записи являются словарями, а некоторые - объектами с перечисленными свойствами?
В любом случае, вы можете получить больше гибкости, создав дескриптор сортировки с помощью initWithKey: ascending: comptor: . Это позволяет вам предоставить блок компаратора в качестве функции сортировки, которая является более гибкой, чем прямой селектор, например
NSComparator mySort = ^(id obj1, id obj2)
{
NSComparisonResult ret = NSOrderedSame;
if ([obj1 isKindOfClass: [NSDictionary class]] && ![obj2 isKindOfClass: NSDictionary class]])
{
ret = NSOrderedAscending;
}
else if (![obj1 isKindOfClass: [NSDictionary class]] && [obj2 isKindOfClass: NSDictionary class]])
{
ret = NSOrderedDescending;
}
return ret;
};
NSSortDescriptor* descriptor = [[NSSortDescriptor alloc] initWithKey: @"self" ascending: YES comparator: mySort];
даст вам дескриптор сортировки, который сортирует массив, помещая сначала все NSDictionaries, а затем другие объекты. (self
- это ключ, которым обладают все NSObject
s, который возвращает сам объект).