Swift 似乎Swfit.AnyHashable没有正确地使用枚举大小写(as!、as?、as)
下面是AnyHashable不支持使用枚举强制转换的一个简单示例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
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之外的任何类型)。