看起来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.

+0

您应该使用'Any'而不是'AnyHashable'。顺便说一句,这是斯威夫特约定来命名您的枚举以大写字母开头,您的案例以小写字母开头 –

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) 

注意AnyHashable是一种完全不同的东西比AnyAnyObject。后两者是协议。前者是一个类型擦除结构。 stdlib中的前缀Any...的意思是“类型 - 擦除器”,除了古怪的特殊情况(您应尽可能避免人为操作)AnyAnyObject

+0

我知道AnyHashable只是一个包装,以擦除类型,这就是为什么我使用它。但我猜这种不一致的行为让我失望了。我认为它有一些速记支持,基于它为某些类型(除了枚举之外的任何类型)工作的事实而忽略基本属性以便于使用。 – MurderDev