【发布时间】:2019-10-25 13:06:56
【问题描述】:
我在在线教程中遇到了这样的异构字典定义:
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): 任意(“零”),
谢谢你的回答
【问题讨论】:
-
AnyHashable是一个实际的类型,Any只是protocol— 一个类型的接口契约。 -
@user28434 虽然请参阅本页的底部段落:docs.swift.org/swift-book/LanguageGuide/TypeCasting.html 其中声明 Any 是一种类型。
-
我会这样写:
var mixedMap4: [AnyHashable : Any] = [0: "Zero", 1: 1.0, "pi" : 3.14] -
@tiw
Any是一个协议,从形式上讲,它是“通用类型”。它是所有其他类型的超类型,但这是一些编译器魔法,因为您没有显式编写“struct MyType: Any”。一致性是隐含的。您可以编写let i: Any = 0并让它工作的事实是这种隐式一致性的结果。AnySequence是一个结构。您可以编写let i: AnyHashable = 1的事实证明了一些编译器魔法,这使得任何符合Hashable的类型都可以转换为AnyHashable。但这不是常态。例如,试试let a: AnySequence = []。 -
AnyHashable 有点神奇,并且被编译器特例化了。见github.com/apple/swift/blob/…。
标签: swift dictionary casting protocols declaration