【问题标题】:Difference between wrapping a value and explicitly declaring value as a type in Swift在 Swift 中包装一个值和将值显式声明为类型之间的区别
【发布时间】: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


【解决方案1】:

线索在错误信息中。

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

Any 是一个协议,因此不能直接实例化,尽管所有其他类型都可以符合它,因此 String 如“零”可以转换为 AnyAny(String) 是毫无意义。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-05
    • 2016-12-16
    • 1970-01-01
    • 2021-09-25
    • 2015-11-03
    • 1970-01-01
    • 2014-01-14
    相关资源
    最近更新 更多