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

Swift 4中初始化NSDictionary崩溃问题求助:对象与键数量不匹配

问题排查与解决方案

嗨,我来帮你搞定这个崩溃问题~

崩溃原因

你遇到的报错[NSDictionary initWithObjects:forKeys:]: count of objects (12) differs from count of keys (1),核心原因是**NSDictionary.init(objects:forKeys:)方法要求objects数组和keys数组的元素数量必须完全相等**——它的设计逻辑是「每个key对应一个object」,比如1个key对应1个object,3个key对应3个object。但你这里objects是包含12个月份的数组,keys却只有["values"]这1个元素,数量不匹配,系统自然就崩溃了。

正确实现方式

你的需求是创建一个key为values、value为12个月份数组的字典,完全不需要用init(objects:forKeys:)这个方法。这里给你两种写法:

1. 推荐的Swift原生字典写法(类型更安全)

let df = DateFormatter()
// 直接用[String]声明数组,替代[Any],更符合类型规范
var months = [String]()
for monthIndex in 1...12 {
    months.append(df.monthSymbols[monthIndex - 1])
}
// 直接创建Swift字典,key为"values",value为months数组
let monthDictionary = ["values": months]
// 如果需要转换成NSDictionary,直接强转即可
let nsMonthDictionary = monthDictionary as NSDictionary

2. 简化的NSDictionary写法(更直接)

其实DateFormatter的monthSymbols本身就返回包含12个月份的数组,你甚至不需要自己写循环:

let df = DateFormatter()
let months = df.monthSymbols // 直接拿到12个月份的数组
// 用单个object对应单个key的初始化方法
let monthDictionary = NSDictionary(object: months, forKey: "values" as NSCopying)

额外优化建议

你原来的代码里把months声明为[Any],但monthSymbols返回的是明确的[String]类型,直接用[String]声明数组会更类型安全,避免后续操作中可能出现的类型转换问题。

内容的提问来源于stack exchange,提问作者AK1188

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:19:53