下面是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

天气会好起来的。
我已经用struct、自定义类和String尝试过了,它们都正确地进行了转换。例如,这是可行的。
let myObject: AnyHashable = "Test" as AnyHashable
let newObject = myObject as? String

这是swift中的一个错误还是我在这里做得不对。
我在Swift 3.2和Swift 4中试过这个。

最佳答案

AnyHashableexplicitly 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...表示“类型橡皮擦”,除了奇怪的特殊情况(您应该尽可能避免这种情况)AnyAnyObject

关于swift - 看来Swfit.AnyHashable不能正确地用枚举大小写(as !, as ?, as),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46436805/

10-09 00:15