NSDictionary&NSMutableDictionary常用操作

本文详细介绍了NSDictionary的基本用法,包括初始化、创建、查询、遍历、排序等操作,并对比了可变字典NSMutableDictionary的相关方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载 :http://blog.youkuaiyun.com/phunxm/article/details/47072831




同数组(NSArray),字典类NSDictionary也支持字面量语法糖Object Literals Syntactic Sugar,允许我们方便地基于字面量定义初始化字典对象。以下基于字面量语法快捷初始化字典(NSDictionary):

[objc]  view plain  copy
 print ?
  1. NSDictionary* literalDictionary = @{@"k1":@"v1"@"k2":@"v2"@"k3":@"v3"};  

需要注意的是数组是有序的,按照addObject的顺序存放;字典是无序的,在进行枚举时,读取的键-值顺序不一定和写入的顺序一致。

 1.创建初始化(Initialization&Creation)

1.1 Initializing an Dictionary(NS_DESIGNATED_INITIALIZER)

[objc]  view plain  copy
 print ?
  1. - (instancetype)init NS_DESIGNATED_INITIALIZER;  
  2.   
  3. // 基于va_list初始化NSDictionary  
  4. - (instancetype)initWithObjectsAndKeys:(id)firstObject, ... NS_REQUIRES_NIL_TERMINATION;  
  5. // 基于keys数组和对应的values数组初始化NSDictionary  
  6. - (instancetype)initWithObjects:(NSArray *)objects forKeys:(NSArray *)keys;  
  7. // 基于other Dictionary初始化新的NSDictionary  
  8. - (instancetype)initWithDictionary:(NSDictionary *)otherDictionary;  
  9. - (instancetype)initWithDictionary:(NSDictionary *)otherDictionary copyItems:(BOOL)flag;  

1.2 Creating an Dictionary (autorelease)

[objc]  view plain  copy
 print ?
  1. + (instancetype)dictionary;  
  2. // 以一对key-value初始化NSDictionary  
  3. + (instancetype)dictionaryWithObject:(id)object forKey:(id <NSCopying>)key;  
  4. // initWithObjectsAndKeys:对应的类静态实例化方法  
  5. + (instancetype)dictionaryWithObjectsAndKeys:(id)firstObject, ... NS_REQUIRES_NIL_TERMINATION;  
  6. // initWithObjects:forKeys:对应的类静态实例化方法  
  7. + (instancetype)dictionaryWithObjects:(NSArray *)objects forKeys:(NSArray *)keys;  
  8. // initWithDictionary:对应的类静态实例化方法  
  9. + (instancetype)dictionaryWithDictionary:(NSDictionary *)dict;  

以下是简单的示例:

[objc]  view plain  copy
 print ?
  1. NSDictionary* queryItemDict1 = [NSDictionary dictionaryWithObjectsAndKeys:@"v1"@"k1"@"v2"@"k2"@"v3"@"k3", nil nil];  
  2. NSLog(@"queryItemDict1 = %@", queryItemDict1);  
  3. NSDictionary* queryItemDict2 = [NSDictionary  dictionaryWithObjects:@[@"v1"@"v2"@"v3"] forKeys:@[@"k1"@"k2"@"k3"]];  
  4. NSLog(@"queryItemDict2 = %@", queryItemDict2);  

2.访问字典(Querying)

2.1 字典键值对个数

[objc]  view plain  copy
 print ?
  1. @property (readonly) NSUInteger count;  

可以基于dictionary.count对字典进行判空:如果dictionary.count=0,则表示字典为nil或不包含任何键值对。

[objc]  view plain  copy
 print ?
  1. @property (readonlycopyNSArray *allKeys; // 所有key的数组  
  2. @property (readonlycopyNSArray *allValues; // 所有value的数组  

2.2 键值索引查询

[objc]  view plain  copy
 print ?
  1. // 查找key对应的value(NSObject)  
  2. - (id)objectForKey:(id)aKey;  
  3. // 等效于objectForKey,支持中括号下标格式(dictionary[key])访问指定键的值。  
  4. - (id)objectForKeyedSubscript:(id)key NS_AVAILABLE(10_86_0);  
  5. // 查找value相同的所有keys  
  6. - (NSArray *)allKeysForObject:(id)anObject;  
  7. // 基于keys数组查找对应的values数组  
  8. - (NSArray *)objectsForKeys:(NSArray *)keys notFoundMarker:(id)marker;  

以下objectsForKeys:notFoundMarker:示例:

[objc]  view plain  copy
 print ?
  1. NSArray *keyArr = @[@"k1"@"k2"@"k3"];  
  2. NSArray *objArr = [NSArray arrayWithObjects:@"v1"@"v2"@"v3", nil nil];  
  3. NSArray *srcArr = [NSArray arrayWithObjects:@"k0"@"k2", nil nil];  
  4. NSDictionary *dict = [NSDictionary dictionaryWithObjects:objArr forKeys:keyArr];  
  5. // NSArray *resArr = [dict objectsForKeys:srcArr notFoundMarker:@"not found"]; // ("not found", v2)  
  6. NSArray *resArr = [dict objectsForKeys:srcArr notFoundMarker:[NSNull null]]; // ("<null>", v2)  

3.遍历字典(Enumerate)

[objc]  view plain  copy
 print ?
  1. - (void)enumerateKeysAndObjectsUsingBlock:(void (^)(id key, id obj, BOOLBOOL *stop))block NS_AVAILABLE(10_64_0);  
  2. - (NSSet *)keysOfEntriesPassingTest:(BOOL (^)(id key, id obj, BOOLBOOL *stop))predicate NS_AVAILABLE(10_64_0);  

4.字典排序(Sorting)

keysSortedByValueUsingSelector/keysSortedByValueUsingComparator通过使用指定SELNSComarator来对allKeys进行排序,然后通过objectsForKeys取出排序后的键-值对。

[objc]  view plain  copy
 print ?
  1. - (NSArray *)keysSortedByValueUsingSelector:(SEL)comparator;  
  2. - (NSArray *)keysSortedByValueUsingComparator:(NSComparator)cmptr NS_AVAILABLE(10_64_0);  

5.可变字典(NSMutableDictionary)

5.1 Initializing an Dictionary(NS_DESIGNATED_INITIALIZER)

除了继承NSDictionary基本的init,还增加了以下指定初始化函数:

[objc]  view plain  copy
 print ?
  1. - (instancetype)initWithCapacity:(NSUInteger)numItems NS_DESIGNATED_INITIALIZER;  

5.2 setObject for key

[objc]  view plain  copy
 print ?
  1. // 赋值替换键值对  
  2. - (void)setObject:(id)anObject forKey:(id <NSCopying>)aKey;  
  3. // 等效于setObject:forKey:,支持中括号下标格式(dictionary[key]=)赋值替换。  
  4. - (void)setObject:(id)obj forKeyedSubscript:(id <NSCopying>)key NS_AVAILABLE(10_86_0);  

例如,以下代码片段获取URL Components查询串中的queryItem Dictionary:

[objc]  view plain  copy
 print ?
  1. // http://weixin.sogou.com/weixin?type=2&ie=utf-8&query=NASA发现新地球  
  2. NSString* wxNASAURLPath = @"http://weixin.sogou.com/weixin?type=2&ie=utf-8&query=NASA%E5%8F%91%E7%8E%B0%E6%96%B0%E5%9C%B0%E7%90%83";  
  3. NSURLComponents* wxNASAURLComponents =  [NSURLComponents componentsWithString:wxNASAURLPath];  
  4. NSMutableDictionary* queryItemDict = [NSMutableDictionary dictionary];  
  5. NSArray* queryItems = wxNASAURLComponents.queryItems;  
  6. for (NSURLQueryItem* item in queryItems) {  
  7.     [queryItemDict setObject:item.value forKey:item.name];  
  8. }  
  9. NSLog(@"queryItemDict = %@", queryItemDict);  

5.3 addEntries & setDictionary

[objc]  view plain  copy
 print ?
  1. // 从otherDictionary追加entries到当前Dictionary  
  2. - (void)addEntriesFromDictionary:(NSDictionary *)otherDictionary;  
  3. // 等效于先removeAllObjects后addObjectsFromArray;setDictionary类似于对retain propery的赋值(setter)。  
  4. - (void)setDictionary:(NSDictionary *)otherDictionary;  

5.4 removeObject

[objc]  view plain  copy
 print ?
  1. // 删除指定key的键值对  
  2. - (void)removeObjectForKey:(id)aKey;  
  3. // 删除指定key数组对应的键值对  
  4. - (void)removeObjectsForKeys:(NSArray *)keyArray;  
  5. // 删除清空所有键值对  
  6. - (void)removeAllObjects;  


6.参考

NSDictionary API学习OC字典NSDictionary

OC基础集合类Objective-C研究院之词典对象(八)

NSDictionary/NSMutableDictionary 及 NSArray/NSmutableArray (实例)

电动汽车数据集:2025年3K+记录 真实电动汽车数据:特斯拉、宝马、日产车型,含2025年电池规格和销售数据 关于数据集 电动汽车数据集 这个合成数据集包含许多品牌和年份的电动汽车和插电式车型的记录,捕捉技术规格、性能、定价、制造来源、销售和安全相关属性。每一行代表由vehicle_ID标识的唯一车辆列表。 关键特性 覆盖范围:全球制造商和车型组合,包括纯电动汽车和插电式混合动力汽车。 范围:电池化学成分、容量、续航里程、充电标准和速度、价格、产地、自主水平、排放、安全等级、销售和保修。 时间跨度:模型跨度多年(包括传统和即将推出的)。 数据质量说明: 某些行可能缺少某些字段(空白)。 几个分类字段包含不同的、特定于供应商的值(例如,Charging_Type、Battery_Type)。 各列中的单位混合在一起;注意kWh、km、hr、USD、g/km和额定值。 列 列类型描述示例 Vehicle_ID整数每个车辆记录的唯一标识符。1 制造商分类汽车品牌或OEM。特斯拉 型号类别特定型号名称/变体。型号Y 与记录关联的年份整数模型。2024 电池_类型分类使用的电池化学/技术。磷酸铁锂 Battery_Capacity_kWh浮充电池标称容量,单位为千瓦时。75.0 Range_km整数表示充满电后的行驶里程(公里)。505 充电类型主要充电接口或功能。CCS、NACS、CHAdeMO、DCFC、V2G、V2H、V2L Charge_Time_hr浮动充电的大致时间(小时),上下文因充电方法而异。7.5 价格_USD浮动参考车辆价格(美元).85000.00 颜色类别主要外观颜色或饰面。午夜黑 制造国_制造类别车辆制造/组装的国家。美国 Autonomous_Level浮点自动化能力级别(例如0-5),可能包括子级别的小
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值