You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:14:22