下面是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中试过这个。
最佳答案
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)
注意
AnyHashable
与Any
或AnyObject
完全不同。后两个是协议。前者是一个类型擦除结构。stdlib中的前缀Any...
表示“类型橡皮擦”,除了奇怪的特殊情况(您应该尽可能避免这种情况)Any
和AnyObject
。关于swift - 看来Swfit.AnyHashable不能正确地用枚举大小写(as !, as ?, as),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46436805/