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