Swift 3中如何从NSMutableDictionary获取指定索引的元素
解决NSMutableDictionary获取“第一个”元素的问题
嘿,这个问题我之前也踩过坑!核心问题在于NSMutableDictionary本身是无序的——它的键值对存储没有固定的顺序,所以你用enumerated()遍历的时候,得到的元素顺序完全是不确定的,自然没法通过count == 2(或者任何索引)来拿到你预期的“第一个”元素。
为什么你的代码行不通?
你写的这段代码:
for (count, i) in myMutableDict.enumerated() { if count == 2 { print(i.key) } }
因为字典的遍历顺序不固定,count == 2对应的键完全是随机的,每次运行可能都不一样,根本无法保证是你想要的那个“第一个”元素。
可行的解决方法
方法1:获取任意一个元素(不关心顺序)
如果你只是需要拿到字典里的某一个元素(不要求是插入的第一个),可以直接取字典的keys或values集合的第一个元素,这是最简便的方式:
// Swift 写法 if let firstKey = myMutableDict.keys.first { print(firstKey) // 如果需要对应的值: let firstValue = myMutableDict[firstKey] } // 兼容Objective-C风格的写法(如果项目混用OC) if let firstKey = myMutableDict.allKeys.first as? String { print(firstKey) }
方法2:使用有序字典(需要iOS 15+/macOS 12+)
如果你需要严格按照插入顺序获取“第一个”元素,可以用Foundation框架提供的OrderedDictionary,它会保留元素的插入顺序:
import Foundation // 初始化有序字典 let orderedDict = OrderedDictionary<String, Any>() orderedDict["firstKey"] = "firstValue" orderedDict["secondKey"] = "secondValue" // 获取第一个元素的键 if let firstKey = orderedDict.keys.first { print(firstKey) // 输出 "firstKey" let firstValue = orderedDict[firstKey] }
方法3:自己维护键的顺序(兼容老系统)
如果你的项目需要支持iOS 15以下的系统,可以自己维护一个数组来记录键的插入顺序,然后通过数组的索引来获取对应的元素:
// 维护键的顺序数组和字典 var keyOrder: [String] = [] var myMutableDict: NSMutableDictionary = [:] // 添加元素时同时记录顺序 func addItem(withKey key: String, value: Any) { myMutableDict.setValue(value, forKey: key) if !keyOrder.contains(key) { keyOrder.append(key) } } // 获取第一个元素 if let firstKey = keyOrder.first { let firstValue = myMutableDict.value(forKey: firstKey) print(firstKey) }
总结
NSMutableDictionary的设计本身就是无序的,所以永远不要依赖它的遍历顺序来定位元素。根据你的需求选择对应的方案:
- 只需要任意元素:用
first方法直接取 - 需要固定顺序:用
OrderedDictionary或者自己维护键的顺序
内容的提问来源于stack exchange,提问作者Naval Hasan
相关产品推荐
相关产品推荐

