Swift 4中AnyHashable类型无法调用copy方法的问题求助
嘿,我来帮你搞定这个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

