看起来Swfit.AnyHashable不是套用(与!, as一样),正确使用枚举
下面是AnyHashable不支持使用枚举来铸造的简单案例。看起来Swfit.AnyHashable不是套用(与!, as一样),正确使用枚举
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中的错误还是我在这里只是没有做到这一点。
我在夫特3.2尝试这样做,夫特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
。
我知道AnyHashable只是一个包装,以擦除类型,这就是为什么我使用它。但我猜这种不一致的行为让我失望了。我认为它有一些速记支持,基于它为某些类型(除了枚举之外的任何类型)工作的事实而忽略基本属性以便于使用。 – MurderDev
您应该使用'Any'而不是'AnyHashable'。顺便说一句,这是斯威夫特约定来命名您的枚举以大写字母开头,您的案例以小写字母开头 –