Swift 似乎Swfit.AnyHashable没有正确地使用枚举大小写(as!、as?、as)

Swift 似乎Swfit.AnyHashable没有正确地使用枚举大小写(as!、as?、as),swift,enums,hashable,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? tes

下面是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中尝试了这一点。

AnyHashable

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

这对某些类型恰好有效,这是一个令人惊讶的事实,而不是它对枚举失败。我希望这是一个性能优化,有助于使用字典。但这并不是人们期望您如何使用
AnyHashable
。预期的用法是使用
AnyHashable.init
初始化它,而不是将
初始化为AnyHashable

你的意思是:

enum TestEnum: String {
    case test
}

let myObject = AnyHashable(TestEnum.test)
myObject.base               // => test (as an Any)
myObject.base as? TestEnum  // => Optional<TestEnum>(.test)
enum TestEnum:String{
案例测试
}
让myObject=AnyHashable(TestEnum.test)
myObject.base/=>测试(作为任何测试)
myObject.base作为?TestEnum/=>可选(.test)
请注意,
AnyHashable
Any
AnyObject
是一种完全不同的东西。后两种是协议。前者是一个类型擦除结构。stdlib中的前缀
Any…
表示“键入橡皮擦”,除了奇怪的特殊情况(您应该尽可能避免)
Any
AnyObject
AnyHashable

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

这对某些类型恰好有效,这是一个令人惊讶的事实,而不是它对枚举失败。我希望这是一个性能优化,有助于使用字典。但这并不是人们期望您如何使用
AnyHashable
。预期的用法是使用
AnyHashable.init
初始化它,而不是将
初始化为AnyHashable

你的意思是:

enum TestEnum: String {
    case test
}

let myObject = AnyHashable(TestEnum.test)
myObject.base               // => test (as an Any)
myObject.base as? TestEnum  // => Optional<TestEnum>(.test)
enum TestEnum:String{
案例测试
}
让myObject=AnyHashable(TestEnum.test)
myObject.base/=>测试(作为任何测试)
myObject.base作为?TestEnum/=>可选(.test)

请注意,
AnyHashable
Any
AnyObject
是一种完全不同的东西。后两种是协议。前者是一个类型擦除结构。stdlib中的前缀
Any…
表示“类型橡皮擦”,除了奇怪的特殊情况(您应该尽可能避免)
Any
AnyObject

您应该使用
Any
而不是
AnyHashable
。顺便说一句,按照Swift惯例,枚举的名称以大写字母开头,大小写以小写字母开头。您应该使用
Any
而不是
AnyHashable
。顺便说一句,按照Swift惯例,枚举的名称以大写字母开头,大小写以小写字母开头。我知道AnyHashable只是一个用于删除类型的包装器,这就是我使用它的原因。但我想这种前后矛盾的行为让我很反感。我假设它有一些速记支持,可以忽略base属性以便于使用,因为它适用于某些类型(以及除enum以外的任何类型)。我知道AnyHashable只是一个用于擦除类型的包装器,这就是我使用它的原因。但我想这种前后矛盾的行为让我很反感。我假设它有一些速记支持,可以忽略base属性以便于使用,因为它适用于某些类型(除了enum之外的任何类型)。