gpt4 book ai didi

swift - 似乎 Swfit.AnyHashable 不适合使用枚举 (as!, as?, as)

转载 作者:行者123 更新时间:2023-11-28 12:16:20 32 4
gpt4 key购买 nike

这是一个 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 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)

请注意,AnyHashableAnyAnyObject 完全不同。后两个是协议(protocol)。前者是类型删除结构。 stdlib 中的前缀 Any... 表示“类型橡皮擦”,除了奇怪的特殊情况(你应该尽可能避免人类可能) Any任何对象

关于swift - 似乎 Swfit.AnyHashable 不适合使用枚举 (as!, as?, as),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46436805/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com