似乎 Swfit.AnyHashable 不适合使用枚举 (as!, as?, as)

It seems Swfit.AnyHashable is not casing (as!, as?, as) properly with enums

这是一个 AnyHashable 不支持枚举类型转换的简单案例。

enum testEnum: String {
    case Test
}

let myObject: AnyHashable = testEnum.Test as AnyHashable
let newObject = myObject as? testEnum

在这种情况下,newObject 将 return 为零。如果我改为执行

let newObject = (myObject as? AnyObject) as? testEnum

它会很好地投射。

我已经用结构、自定义 类 和 String 试过了,它们都正确转换。例如这行得通。

let myObject: AnyHashable = "Test" as AnyHashable
let newObject = myObject as? String

这是 swift 中的一个错误还是我只是没有正确执行此操作。

我在 Swift 3.2 和 Swift 4 中试过这个。

AnyHashable explicitly type-erases:

The AnyHashable type forwards equality comparisons and hashing operations to an underlying hashable value, hiding its specific underlying type.

这恰好适用于某些类型这一事实令人惊讶,而不是它不适用于枚举。我希望这是一种性能优化来帮助字典。但这不是您使用 AnyHashable 的方式。预期的用法是用 AnyHashable.init 初始化它,而不是 as AnyHashable.

你的意思是这样的:

enum TestEnum: String {
    case test
}

let myObject = AnyHashable(TestEnum.test)
myObject.base               // => test (as an Any)
myObject.base as? TestEnum  // => Optional<TestEnum>(.test)

请注意 AnyHashableAnyAnyObject 完全不同。后两个是协议。前者是类型擦除结构。 stdlib 中的前缀 Any... 表示 "type-eraser" 除了古怪的特殊情况(你应该尽可能避免) AnyAnyObject.