首页 > 解决方案 > 在 Swift 中包装一个值和将值显式声明为类型之间的区别

问题描述

我在在线教程中遇到了这样的异构字典定义:

var mixedMap4 = [AnyHashable(0): "Zero" as Any,
                 AnyHashable(1): 1.0 as Any,
                 AnyHashable("pi"): 3.14 as Any]

我想知道为什么作者选择写 AnyHashable(0)而不是0 as AnyHashable。当我在 Swift 操场上尝试这个时,它也有效。但是,当我变成"Zero" as Any它时Any(0),会给出以下内容

错误:错误:Dictionary.xcplaygroundpage:41:34:错误:协议类型'Any'无法实例化 var mixedMap4 = [AnyHashable(0): Any("Zero") ,

谢谢你的回答

标签: swiftdictionarycastingprotocolsdeclaration

解决方案


线索在错误消息中。

AnyHashable是一个类型擦除底层可哈希类型的结构,因此可以直接实例化为对象

Any是一个协议,因此不能直接实例化,尽管所有其他类型都可以遵守它,因此可以将String诸如“零”之类的转换为AnyAny(String)没有意义。

对我来说,这一切都感觉就像一大堆麻烦等着发生!


推荐阅读