似乎Swfit.AnyHashable没有与枚举正确套管(如!,作为?)

时间:2017-09-26 22:37:12

标签: swift enums hashable

以下是AnyHashable不支持使用枚举进行转换的简单示例。

enum testEnum: String {
    case Test
}

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

在这种情况下,newObject将返回nil。如果我转而去做

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

它会很好。

我已经尝试过使用结构,自定义类和字符串,它们都可以正确地进行转换。例如,这有效。

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

这是swift中的错误还是我在这里没有正确执行此操作。

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

1 个答案:

答案 0 :(得分:2)

AnyHashable explicitly type-erases

  

AnyHashable类型将相等比较和散列操作转发给基础可散列值,隐藏其特定的基础类型。

事实上,这适用于某些类型是令人惊讶的事实,而不是它的枚举失败。我希望这是一个性能优化来帮助字典。但这不是您期望使用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