0

NSMutableArray我用两个元素创建了一个;城市名称(索引 0 处的字符串)和与我当前位置的距离(索引 1 处的两倍)。

for (i=0;i<[City count];++i)
{
distanceFromMe = [Location distanceFromLocation:[cityLocation]];
[a addObject:[cityNames objectatIndex:i]];
[a addObject:@(distanceFromMe)]
[cityArray addObject:a]
}

“芝加哥”,560.34

“纽约”,204.3456

“雪城”,50.04

我想按升序对这个数组进行排序。

“雪城”,50.04

“纽约”,204.3456

“芝加哥”,560.34

我用了:

[cityArray sortUsingDescriptors:@[ [NSSortDescriptor sortDescriptorWithKey:nil ascending:YES] ]];

但是我不断收到一个无法识别的选择器发送到实例的错误。在我的阅读中,该方法似乎不需要键,因为NSNumber数组元素中只有一个键。我已经阅读了许多不同的主题,但似乎没有一个适用。

任何帮助,将不胜感激。使用 xcode obj-c 不迅速。

4

2 回答 2

1

我会在不使用排序描述符的情况下做到这一点。

[cityArray sortUsingComparator:
    ^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {
        NSArray* arr1 = obj1;
        NSArray* arr2 = obj2;
        return [arr1[1] compare: arr2[1]];
    }];
于 2019-11-27T20:59:36.877 回答
0

虽然@JWWalker 的解决方案有效,但我建议对此进行一些不同的建模。

具体来说,创建一个类来保存城市/距离对:

@interface CityDistance
@property(copy) NSString *name;
@property(copy) NSNumber *distance;
@end

@implementation CityDistance
@end

存储您的每个城市/距离对。

CityDistance *cityDistance = [[CityDistance alloc] init];
cityDistance.name = @"New York";
cityDistance.distance = @(560.3);

NSMutableArray <CityDistance *>*cities = [NSMutableArray array];
[cities addObject: cityDistance];

这允许编译器进行更多类型检查,您可以将业务逻辑挂在类上(即,可能是一个-(NSNumber *)distanceFromCity:(CityDistance *)otherCity;方法?),它不那么脆弱(哎呀!忘记将距离添加到我的模棱两可的数组中!)并使排序代码更多清除:

[cityArray sortUsingComparator:
    ^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {
        CityDistance* city1 = obj1;
        CityDistance* city2 = obj2;
        return [city1.name compare: city2.name];
    }];
于 2019-11-28T23:24:20.067 回答