Swift-类级实例化和方法级实例化之间的差异

Swift-类级实例化和方法级实例化之间的差异,swift,instance-variables,Swift,Instance Variables,以下用法之间有什么区别?有区别吗 class B { } // usage 1 class A { var b: B = B(); } // usage 2 class A { var b: B! init() { self.b = B() } } 编辑: 一些答案指出,在用法2中,该值不需要是可选的,因为它在初始值设定项中获得一个值。是的,这两者之间存在巨大差异。在用法2中,b是一个。当您这样做时: let a = A() 然后在这两种情况下都将

以下用法之间有什么区别?有区别吗

class B { }

// usage 1
class A {
    var b: B = B();
}

// usage 2
class A {
   var b: B!

   init() {
      self.b = B()
   }
}
编辑:
一些答案指出,在用法2中,该值不需要是可选的,因为它在初始值设定项中获得一个值。

是的,这两者之间存在巨大差异。在用法2中,
b
是一个。当您这样做时:

let a = A()
然后在这两种情况下都将设置
a.b
,但在用法2中,有人可以执行以下操作:

a.b = nil

如果你试图使用它,你会得到一个错误。

假设额外的
在用法2中不是你的意思,不,两者之间绝对没有区别

// usage 1
class A {
    var b: B = B();
}


完全一样

实例化是按照赋值语句的声明顺序进行的。但类级语句(存储属性)在方法级语句之前完成:

// in this example, the order will be C, D, B, A
class MyClass {
    init() {
        b = B()
        a = A()
    }

    var a: A
    var b: B
    var c: C = C()
    var d: D = D()
}

在声明站点上的初始化与在
init()
中的初始化之间似乎没有什么区别,不过,这只是属性类型声明中的区别。(我几乎可以说这是OP的一个打字错误。)大卫:没错。问题的标题和示例代码是关于不同的问题的,因此我假设示例代码就是问题的目的,而标题只是一个错误的描述。我想,与编写10行关于您不感兴趣的内容的代码相比,意外使用错误的名称更容易。:-)您是否打算在用法2中而不是在用法1中将
b
作为可选项?FWIW,我只涉猎了Swift,不知道答案,但我知道它介于“默认”值和初始值设定项中指定的值之间。我怀疑,当您查看超类/子类初始值设定项的顺序时,继承层次结构中会有一些微妙之处。例如,.我做了,但我现在看到它不需要是可选的.Hmm。我确实想包含隐式展开的可选项,但现在我发现我不需要它。如果我有一个带有init()方法的继承层次结构,但我也像用法1那样实例化了一个变量,会发生什么?在init()中初始化的变量是在类级实例化之前还是之后得到它们的值?只要所有变量都在init结束时初始化,如果不打算在其中存储nil,就不需要将它们设置为可选。
// in this example, the order will be C, D, B, A
class MyClass {
    init() {
        b = B()
        a = A()
    }

    var a: A
    var b: B
    var c: C = C()
    var d: D = D()
}