当前位置: 首页 > 知识库问答 >
问题:

为什么要创建“隐式展开的Optionals”,因为这意味着您知道有一个值?

锺星洲
2023-03-14
let someString: String! = "this is the string"
let someString: String = "this is the string"

共有1个答案

谷出野
2023-03-14

在我描述隐式解包Optionals的用例之前,您应该已经了解了Swift中的Optionals和隐式解包Optionals是什么。如果你不知道,我建议你先读读我的关于optionals的文章

创建隐式展开的可选选项有两个主要原因。所有这些都与定义一个变量有关,当nil时,该变量将永远不会被访问,因为否则,Swift编译器将总是强制您显式地解压缩一个可选的变量。

在初始化完成时,每个成员常数都必须有一个值。有时,在初始化过程中不能用其正确的值初始化常数,但仍然可以保证在访问之前有一个值。

使用可选变量可以解决这个问题,因为可选变量会自动初始化为nil,并且它最终包含的值仍然是不可变的。然而,不断地展开一个您确定不是零的变量可能是一种痛苦。隐式展开的Optionals与可选的Optionals具有相同的优点,还有一个额外的优点,即不必在任何地方显式展开它。

一个很好的例子是,在UIView子类中无法初始化成员变量,直到视图加载:

class MyView: UIView {
    @IBOutlet var button: UIButton!
    var buttonOriginalWidth: CGFloat!

    override func awakeFromNib() {
        self.buttonOriginalWidth = self.button.frame.size.width
    }
}

在这里,在视图加载之前不能计算按钮的原始宽度,但是您知道AwakeFromnib将在视图上的任何其他方法(初始化除外)之前调用。您可以将该值声明为隐式展开的可选项,而不是强制在整个类中毫无意义地显式展开该值。

class FileSystemItem {
}

class Directory : FileSystemItem {
    lazy var contents : [FileSystemItem] = {
        var loadedContents = [FileSystemItem]()
        // load contents and append to loadedContents
        return loadedContents
    }()
}

现在,成员变量contents直到第一次被访问时才初始化。这使类有机会在计算初始值之前进入正确的状态。

注意:从上面看,这似乎与#1相矛盾。但是,有一个重要的区别要做。必须在viewDidLoad期间设置上面的ButtonOriginalWidth,以防止任何人在访问属性之前更改按钮宽度。

在大多数情况下,应该避免隐式展开的选项,因为如果错误地使用,当nil访问时,整个应用程序将崩溃。如果您不确定变量是否可以为nil,请始终默认使用普通的可选变量。展开一个从不nil的变量当然不会有太大的伤害。

 类似资料:
  • 问题内容: 为什么只创建一个正则变量或常量而不是创建一个“隐式展开的可选”?如果您知道可以成功解包,那么为什么首先要创建一个可选的?例如,为什么这样: 比以下内容更有用: 如果“可选参数指示允许常量或变量具有’无值’”,但“有时从程序的结构中可以看出,可选参数在首次设置该值后将始终具有一个值”,这是什么意思呢?首先使它成为可选项?如果您知道可选值总是会有一个值,那不是使它成为非可选值吗? 问题答案

  • 我想创建一个

  • 套接字由ip:port定义。服务器和客户端都将有自己的套接字 套接字连接由五个touples定义:server_ip、server_port、client_ip、client_port、protocol 套接字描述符是标识套接字的整数值 我尝试实现自己的服务器,其中socket()和accept()返回不同的套接字描述符值(总是这样吗?)。我的问题是,为什么说accept()会创建一个新的套接字,

  • 问题内容: 我了解这是用来创建别名的。因此,将一个长名称别名为一个短名称是有意义的。但是,我看到一个查询 ,这意味着什么? 问题答案: 可以以多种方式使用别名,而不仅仅是缩短长列名。 在这种情况下,您的示例意味着您将返回一列始终包含的列,并且其别名/列名称为。 当您使用计算值(例如)时,也可以使用别名。

  • 问题内容: 原始浮点值怎么可能是?这意味着什么? 我可以取消该功能吗? 当我有: 然后返回,也是如此。但是当我打印时,它会打印。 问题答案: 因为Java使用IEEE浮点算术标准(IEEE 754)来定义-0.0和使用它。 可表示的最小数字在次正规有效位中没有1位,并且被称为正负零,由正负号确定。它实际上表示在零到相同符号的最小可表示非零数字之间的范围内将数字四舍五入为零,这就是为什么它有一个符号