Swift - class 级实例化和方法级实例化之间的区别

Swift - difference between class level instantiation and method level instantiation

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

class B { }

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

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

   init() {
      self.b = B()
   }
}

编辑: 一些答案指出,在用法 2 中,该值不需要是可选的,因为它在初始化程序中获得了一个值。

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

let a = A()

然后 a.b 将在两种情况下设置,但在用法 2 中,有人可以这样做:

a.b = nil

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

假设用法 2 中的额外 ! 不是您的意思,

之间绝对没有区别
// usage 1
class A {
    var b: B = B();
}

// usage 2
class A {
   var b: B

   init() {
      self.b = B()
   }
}

一模一样。

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

// 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()
}