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
相关产品推荐
相关产品推荐

