似乎 Swfit.AnyHashable 不适合使用枚举 (as!, as?, as)
It seems Swfit.AnyHashable is not casing (as!, as?, as) properly with enums
这是一个 AnyHashable 不支持枚举类型转换的简单案例。
enum testEnum: String {
case Test
}
let myObject: AnyHashable = testEnum.Test as AnyHashable
let newObject = myObject as? testEnum
在这种情况下,newObject 将 return 为零。如果我改为执行
let newObject = (myObject as? AnyObject) as? testEnum
它会很好地投射。
我已经用结构、自定义 类 和 String 试过了,它们都正确转换。例如这行得通。
let myObject: AnyHashable = "Test" as AnyHashable
let newObject = myObject as? String
这是 swift 中的一个错误还是我只是没有正确执行此操作。
我在 Swift 3.2 和 Swift 4 中试过这个。
AnyHashable
explicitly type-erases:
The AnyHashable type forwards equality comparisons and hashing operations to an underlying hashable value, hiding its specific underlying type.
这恰好适用于某些类型这一事实令人惊讶,而不是它不适用于枚举。我希望这是一种性能优化来帮助字典。但这不是您使用 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...
表示 "type-eraser" 除了古怪的特殊情况(你应该尽可能避免) Any
和 AnyObject
.
这是一个 AnyHashable 不支持枚举类型转换的简单案例。
enum testEnum: String {
case Test
}
let myObject: AnyHashable = testEnum.Test as AnyHashable
let newObject = myObject as? testEnum
在这种情况下,newObject 将 return 为零。如果我改为执行
let newObject = (myObject as? AnyObject) as? testEnum
它会很好地投射。
我已经用结构、自定义 类 和 String 试过了,它们都正确转换。例如这行得通。
let myObject: AnyHashable = "Test" as AnyHashable
let newObject = myObject as? String
这是 swift 中的一个错误还是我只是没有正确执行此操作。
我在 Swift 3.2 和 Swift 4 中试过这个。
AnyHashable
explicitly type-erases:
The AnyHashable type forwards equality comparisons and hashing operations to an underlying hashable value, hiding its specific underlying type.
这恰好适用于某些类型这一事实令人惊讶,而不是它不适用于枚举。我希望这是一种性能优化来帮助字典。但这不是您使用 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...
表示 "type-eraser" 除了古怪的特殊情况(你应该尽可能避免) Any
和 AnyObject
.