【问题标题】:Swift optionals, unwrappingSwift 选项,展开
【发布时间】:2016-09-27 02:43:26
【问题描述】:

我正在学习 swift 语法,对可选类型有点困惑。 因此,从定义来看,除非明确定义为可选项,否则 swift 类型不能存储空值。那么,下一行中的变量在声明时包含什么。

var a:Int  (declaring a variable without intializing it working fine in swift 3)

而且当我们用“!”将变量声明为可选时,

var optionalSquare: Square! = Square(sideLength: 10, name: "Optional Square")

如果我们想使用“optionalSquare”变量,我们不需要打开它,因为我们确定(我认为这就是我们使用“!”而不是“?”的原因)它不包含任何空值.那么我们为什么不将其声明为普通变量。

请更正任何虚假陈述。谢谢。

【问题讨论】:

    标签: ios swift optional


    【解决方案1】:

    [var a:Int]在声明时包含什么

    什么都没有。它的值是未定义的。 在赋值之前使用它是编译错误。你可以声明它而不初始化它,但你不能使用它。

    这是 Swift 安全理念的重要组成部分:在 C 中,您同样可以保留未初始化的变量,并且其值将未定义,但如果您使用它,编译器不会(默认情况下)报告错误。

    那么我们为什么不将它声明为普通变量。

    我没有理由将局部变量设为隐式展开的可选变量。该功能适用​​于结构或类上的 properties(“ivars”)。您应该在无法在对象的init 中设置属性的情况下使用它们,但可以肯定的是,在使用对象之前该值将存在。

    IBOutlets 可能是典型的用例。我发现另一个有用的用途是允许通过调用 init 中的方法来设置属性。

    【讨论】:

      【解决方案2】:

      那么,下一行中的变量在声明时包含什么。

      没关系,因为无论如何您都无法访问它。像这样的声明告诉 Swift 你将在稍后决定值。在赋值之前读取变量是编译器要捕获的错误。

      我们为什么不将[强制展开的变量]声明为普通变量?

      因为您可能希望在不应该使用的时候将nil 存储在该变量中。

      例如,您应该使 IB 分配的属性隐式展开,因为它们需要在 NIB 对象“膨胀”之前为 nil,但在 init 方法完成之后:

      @IBOutlet private weak var myLabel: UILabel!
      

      为了使myLabel 成为非可选,您必须删除weak。另一方面,您不想在每次访问myLabel 时都使用感叹号,因为您肯定知道必须对其进行初始化。

      同样的推理也适用于您希望设置为非可选但不能在初始化程序中赋值的其他变量。

      【讨论】:

        【解决方案3】:

        您可以声明一个非可选变量而不对其进行初始化——只要您使用该变量,编译器就不会抱怨。所以这段代码

        var num: Int
        

        不会产生任何错误。但是,如果您在初始化之前引用该变量,编译将失败

        var num: Int
        print(num)
        

        在前一种情况下没有错误,因为初始化可以推迟。您可以声明一个变量,然后在 100 行之后初始化。只要在初始化之前不引用它就可以了。

        要回答您的第二个问题,可以正确地说,在许多情况下,声明和上下文初始化隐式解包变量没有多大意义:非可选变量更合适。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多