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

Swift 4中AnyHashable类型无法调用copy方法的问题求助

解决Swift 4中转Objective-C数组拷贝存入字典的问题

嘿,我来帮你搞定这个Swift转OC的问题~

先拆解下你原Objective-C代码的逻辑:你创建了一个可变的NSMutableArray,然后拷贝出一个不可变的NSArray,再把这个拷贝后的数组作为值存入key为"values"的字典里。

你的Swift代码报错的原因很明确:你用的是Swift原生的[AnyHashable]数组,它不是Foundation框架里的NSMutableArray,所以没有copy()方法——Swift原生数组是值类型,和OC的引用类型集合逻辑不一样,它的拷贝行为是内置的,不需要显式调用copy()方法。

下面给你两种解决方案:

方案1:贴近原OC逻辑的Foundation集合写法

如果你想完全对应原OC的行为(使用Foundation的可变数组),可以这么写:

let months = NSMutableArray()
let monthDictionary = ["values": months.copy() as Any]

这里months是NSMutableArray,调用copy()会返回不可变的NSArray,存入Swift字典时转成Any即可,和原OC的逻辑完全一致。

方案2:更推荐的纯Swift原生写法

Swift的原生数组是值类型,当你把它赋值给字典的时候,会自动完成值拷贝(相当于OC里的浅拷贝),根本不需要显式调用copy()。而且建议尽量用更具体的元素类型,不要随便用AnyHashable,比如如果你的数组是存月份字符串,就用[String],示例:

// 如果存的是字符串,用[String]比AnyHashable更清晰
var months: [String] = []
// 直接赋值给字典,自动完成拷贝
let monthDictionary = ["values": months]

如果确实需要存任意可哈希的元素,把类型改成[AnyHashable]也可以,同样不需要copy():

var months: [AnyHashable] = []
let monthDictionary = ["values": months]

这时候字典里的months是原数组的拷贝,和OC里[months copy]的效果完全一致。

小提示:以后写Swift尽量优先用原生集合类型(Array、Dictionary),比Foundation的NSArray/NSDictionary更符合Swift的设计习惯,也更少遇到这类API不匹配的问题~

内容的提问来源于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:14:22