gpt4 book ai didi

Swift 在可空性可用之前使用 Implicitly Unwrapped Optional

转载 作者:搜寻专家 更新时间:2023-10-31 22:03:11 25 4
gpt4 key购买 nike

在 Apple 关于可空性的博客中,他们提到了这一点:

"...in Swift there’s a strong distinction between optional and non-optional references, e.g. NSView vs. NSView?, while Objective-C represents boths of these two types as NSView *. Because the Swift compiler can’t be sure whether a particular NSView * is optional or not, the type is brought into Swift as an implicitly unwrapped optional, NSView!"



这是否意味着之前在 Swift 中将 Objective-C 方法声明为返回隐式解包可选项时,它实际上可能会崩溃(因为某些使用隐式解包可选项声明的方法可能返回 nil)?或者 Apple 是否确保只有那些绝对不返回 nil 的 Objective-C 方法被声明为隐式解包可选?

最佳答案

Apple 的框架并没有什么特别之处。一开始,你在 Swift 中从 Objective-C 使用的所有东西(每个对象)都是一个隐式解包的可选项。那是因为 Objective-C 中的每个指针都可能返回 nil .

事实上,即使在Objective-C可空性注解的时代,一个方法被注解为nonnull也不是完全不可能的。可以返回 nil . Objective-C 不强制执行可空性规则,它只是提供了一种注释代码的方法,以便在 Swift 中使用它应该更安全。就 Apple 的框架而言,我敢打赌你不会遇到这个问题。或者,如果您这样做了,下一版本的 Xcode 将修复它。

但同样,来自 Objective-C 库和框架的隐式解包选项并没有什么特别之处。隐式解包的可选项告诉您的唯一一件事是框架作者尚未努力注释他们的库(您不能将隐式解包的可选项留在带注释的库中)。 是的,这些隐式展开的选项可以是 nil它们可能会使您的应用程序崩溃。

在 Apple 的情况下,如果出于某种原因,您在不同的项目上使用 Xcode 7 和 Xcode 6,如果您采用 Xcode 7 的更新注释已声明为非可选的内容,则假设 Xcode 中隐式解包的可选版本6永远不会nil可能会解决。但是,如果您采用 Xcode 7 中的可选内容,则假设 Xcode 6 中隐式解包的版本永远不会是 nil很可能会导致您的应用程序崩溃。

最终,在 Swift 中,我们使用隐式解包的可选项应该很少。隐式解包选项的主要用途应该主要用于在类初始化返回之前无法设置的类属性(例如, View Controller 中的 @IBOutlets)。否则,它们很容易成为 Stack Overflow 上众多“意外发现为零”问题的来源。

对于“为什么返回一个隐式展开的可选项而不是可选项?”的问题,有几点……

首先,这是一个语言设计问题。我不是 Objective-C 或 Swift 语言设计团队的成员,而且这些团队中的任何人都不可能停下来回答这个问题......

其次,这就是语言被设计为互操作的方式。任何没有添加可空性注释的 Objective-C 文件都将被视为在 Swift 中一切都是隐式解包的可选项。

第三,隐式可选的原因是它减少了很多if let的冗长。可选将需要的等语句,但不保证变量实际上是 non-nil .造成这种情况的大部分原因可能是因为您认为这些方法中的大多数实际上永远不会返回 nil .

第四,如果你知道哪些有机会成为nil哪些没有,你实际上可以继续编写你的 Swift 代码,这种方式既可以处理对 Objective-C 代码将被注释的方式做出假设。

例如,对于隐式解包的可选项,当然,您可以将其视为非可选项,并删除一些与解包相关的次要冗长。

此外,如果您认为它可能是 nil ,所有可选的解包内容仍然可以使用它。

例子:

override func someFunc(implicitVal: String!) -> String {
return implicitVal ?? "It was nil!"
}

override func someOtherFunc(implicitVal: String!) -> String {
return implicitVal
}

如果我们将它们都假定为可选项,则第二个示例将不起作用

如果我们假设它们是非可选的,第一个例子就行不通了。

隐式解包的可选项允许 Swift 开发人员自由地将它们视为两者之一,前提是他们对值的可能性做出了正确的假设 nil .

关于Swift 在可空性可用之前使用 Implicitly Unwrapped Optional,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30880969/

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