Objective C - 如何将此 NSArray 转换为 NSDictionary 以便我可以通过邮政编码查找城市名称?

Objective C - How do I convert this NSArray to an NSDictionary so I can look up city names by zip code?

我使用 Parse 作为我的后端,并且有一个云函数(用 javascript 编写)只是 return 一个数组

var providerZIPToCity = [ {zip:"48393", city:"WIXOM, MI"},{zip:"48116", city:"48116, MI"},{zip:"48114", city:"BRIGHTON, MI"},{zip:"48189", city:"WHITEMORE LAKE, MI"},{zip:"48178", city:"SOUTH LYON, MI"},{zip:"48168", city:"NORTHVILLE, MI"},{zip:"48167", city:"NORTHVILLE, MI"},{zip:"48375", city:"NOVI, MI"},{zip:"48374", city:"NOVI, MI"},{zip:"48165", city:"NEW HUDSON, MI"},{zip:"48377", city:"NOVI, MI"},{zip:"48390", city:"WALLED LAKE, MI"},{zip:"48381", city:"MILFORD, MI"},{zip:"48226", city:"DETROIT, MI"},{zip:"48201", city:"DETROIT, MI"}];

当我 return 并在我的应用程序中使用以下 objective c 代码将其打印出来时,我得到以下结果:

[PFCloud callFunctionInBackground:@"zipToCity" withParameters:@{} block:^(NSArray *results, NSError *error)
{
    [_activityIndicator stopAnimating];
    if( !error )
    {
        NSLog(@"%@",results);
    }
    else
    {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"CITY LOOKUP FAILED" message:@"We've failed to look up the city names for these ZIP codes.  Try reloading this page from the menu. If the problem persists, you may not have a data or Wi-Fi connection." delegate:self  cancelButtonTitle:@"OK" otherButtonTitles: nil];
        alert.tag = 0;
        [alert show];
    }
}];

returns:

2015-06-10 17:25:04.444 XXXXXXXXX[266:18098] (
        {
        city = "WIXOM, MI";
        zip = 48393;
    },
        {
        city = "48116, MI";
        zip = 48116;
    },
        {
        city = "BRIGHTON, MI";
        zip = 48114;
    },
        {
        city = "WHITEMORE LAKE, MI";
        zip = 48189;
    },
        {
        city = "SOUTH LYON, MI";
        zip = 48178;
    },
        {
        city = "NORTHVILLE, MI";
        zip = 48168;
    },
        {
        city = "NORTHVILLE, MI";
        zip = 48167;
    },
        {
        city = "NOVI, MI";
        zip = 48375;
    },
        {
        city = "NOVI, MI";
        zip = 48374;
    },
        {
        city = "NEW HUDSON, MI";
        zip = 48165;
    },
        {
        city = "NOVI, MI";
        zip = 48377;
    },
        {
        city = "WALLED LAKE, MI";
        zip = 48390;
    },
        {
        city = "MILFORD, MI";
        zip = 48381;
    },
        {
        city = "DETROIT, MI";
        zip = 48226;
    },
        {
        city = "DETROIT, MI";
        zip = 48201;
    }
)

我有一堆标签,其中包含我需要遍历的各种邮政编码,并将邮政编码旁边的标签更改为与该邮政编码关联的城市名称。我需要使用该数组 results 来构建 NSDictionary,或者以某种方式通过当前设置中的邮政编码访问这些城市名称。

问题是,我有点 objective C 菜鸟,我不完全确定这些数据是如何存储在数组中的。这个 NSArray 中的对象是什么类型?对我来说,它们似乎不是字典。我有点难过,只是对数据类型不够熟悉,无法弄清楚如何进行我需要的查找。

谁能指出我如何创建 NSMutableDictionary 的正确方向,我知道如何通过键(邮政编码)查找值(城市名称字符串),或者如何遍历我的邮政编码标签并使用此 NSArray 直接查找城市名称?

我正在想象

NSMutableDictionary *ZIPsToCitiesDictionary = [NSMutableDictionary new];
for( int i = 0; i < [results count]; i++ )
{
    //get element, i.e. ( {city = "WIXOM, MI"; zip = 48393;} )
    //create new NSMutableDictionary element
    [ZIPsToCitiesDictionary setObject: <city> forKey: <zip>];
}

然后我可以使用 label.text 参数来访问城市名称,

或:

NSArray *ZIPLabelArray = ...;
NSMutableArray cityLabelArray = [NSMutableArray new]; //indexes correspond with ZIPLabelArray indexes

for( int i = 0; i < [ZIPLabelArray count]; i++ )
{
    [cityLabelArray addObject: <city name somehow extracted from results by looking up the zip code at ZIPLabelArray[i]> ];
}

感谢任何提示。

你的数组元素确实是字典。要对此进行测试,您可以执行以下操作:

NSLog(@"%@", NSStringFromClass(results[0]));

你们非常亲密。你可以这样做:

NSMutableDictionary *ZIPsToCitiesDictionary = [NSMutableDictionary new];
for(NSDictionary* dict in results)
{
    NSString* city = dict[@"city"];
    NSString* zip = dict[@"zip"];
    [ZIPsToCitiesDictionary setObject:city forKey:zip]; // or ZIPsToCitiesDictionary[zip] = city
}

更新以说明共享同一邮编的多个城市:

NSMutableDictionary *ZIPsToCitiesDictionary = [NSMutableDictionary new];
for(NSDictionary* dict in results)
{
    NSString* city = dict[@"city"];
    NSString* zip = dict[@"zip"];
    NSMutableArray* citiesForZip = ZIPsToCitiesDictionary[zip];
    if (!citiesForZip)
    {
        citiesForZip = [NSMutableArray new];
        ZIPsToCitiesDictionary[zip] = citiesForZip;
    }
    [citiesForZip addObject:city];
}

这将生成一个字典,将邮政编码映射到 数组 个城市。

更简洁的方式

    NSArray *filteredByZip = [results filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"zip == '48393'"]];

这将 return 一组符合条件 zip == 48393 的项目。