在 Swift 中包装值和显式声明值作为类型之间的区别
Difference between wrapping a value and explicitly declaring value as a type in 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 playground 上尝试这个时,它也有效。但是,当我将 "Zero" as Any
变成 Any(0)
时,它会给出以下
error: error: The Dictionary.xcplaygroundpage:41:34: error: protocol
type 'Any' cannot be instantiated var mixedMap4 = [AnyHashable(0):
Any("Zero") ,
感谢您的回答
线索在错误信息中。
AnyHashable
是一个类型擦除底层可哈希类型的结构,因此可以直接实例化为对象
Any
是一个协议,因此不能直接实例化,尽管所有其他类型都可以遵守它,因此 String
例如 "Zero" 可以转换为Any
但 Any(String)
没有意义。
对我来说,这一切就像一大堆等待发生的麻烦!
我在在线教程中遇到了像这样的异构字典定义:
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 playground 上尝试这个时,它也有效。但是,当我将 "Zero" as Any
变成 Any(0)
时,它会给出以下
error: error: The Dictionary.xcplaygroundpage:41:34: error: protocol type 'Any' cannot be instantiated var mixedMap4 = [AnyHashable(0): Any("Zero") ,
感谢您的回答
线索在错误信息中。
AnyHashable
是一个类型擦除底层可哈希类型的结构,因此可以直接实例化为对象
Any
是一个协议,因此不能直接实例化,尽管所有其他类型都可以遵守它,因此 String
例如 "Zero" 可以转换为Any
但 Any(String)
没有意义。
对我来说,这一切就像一大堆等待发生的麻烦!