gpt4 book ai didi

swift - 为什么我们需要显式地将可选类型转换为 Any?

转载 作者:可可西里 更新时间:2023-11-01 00:38:39 25 4
gpt4 key购买 nike

根据 Apple 文档,

The Any type represents values of any type, including optional types. Swift gives you a warning if you use an optional value where a value of type Any is expected. If you really do need to use an optional value as an Any value, you can use the as operator to explicitly cast the optional to Any, as shown below.

var things = [Any]()
things.append(3) // No warning
let optionalNumber: Int? = 3
things.append(optionalNumber) // Warning, even though Any also represents optional types.
things.append(optionalNumber as Any) // No warning

为什么我们需要显式地将可选类型转换为 Any

最佳答案

每种类型都可以隐式提升为该类型的可选类型。这意味着当您将 T? 转换为 Any 时,很难知道它最初是 T 还是最初是 T?(甚至 T?? 或更糟)。最令人困惑的是 Any 可以提升为 Any?Any?Any 类型,所以告诉AnyAny?Any??Any???(等)之间的区别是非常棘手,有时甚至是不可能的。

Any 在 Swift 中是一个非常棘手的类型,几乎不应该被使用。除了明确地欺骗编译器(在一些非常花哨和脆弱的类型橡皮擦中),我不知道在任何情况下将 Any 作为变量类型真的有意义,而且绝对不是[Any] 的形式。如果您创建了一个 [Any],那么您已经走上了一条不会顺利的错误道路。

在极少数情况下,Any 作为函数参数类型是有意义的(print() 是最著名的),但它们在应用程序中极为罕见 -级代码。如果你发现自己需要 Any,你可能做错了什么,编译器会对你大惊小怪,经常让你写额外的 as 代码来使你确定你说的是那些乱七八糟的话。

只是给出一些具体版本,当您输入 Any 时,可选性往往会丢失。所以考虑这种情况:

let number: Int = 3
let optionalNumber: Int? = 3
let nilNumber: Int? = nil

let anyNumber = number as Any
let anyOptional = optionalNumber as Any
let anyNil = nilNumber as Any

if anyNumber is Int { print("number is Int")} // yes
if anyOptional is Int { print("optional number is Int")} // yes
if anyNil is Int { print("nil is Int")} // no

if anyNil is Int? { print("nil is Int?")}
// -> Error: Cannot downcast from 'Any' to a more optional type 'Int?'

老鼠。

我们无法像放入时那样取回可选的。我们当然可以推广它:

if (anyNil as Any?) is Int? { print("nil is Int?") }  // yes

但我们可以通过这种方式提升任何东西,因为一切本身都是隐含的可选:

if (anyNumber as Any?) is Int? { print("number is Int?")}  // also yes

所以,嗯。老鼠。我们真的不知道它最初是否是可选的。这是一团糟,编译器警告你,如果你在这条路上走得太远,它将变得一团糟。 T->Any 有点神奇。 T->T?也有点神奇。结合这两种魔法,您最好清楚自己在做什么。

关于swift - 为什么我们需要显式地将可选类型转换为 Any?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53805768/

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