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()
}
以下用法有什么区别?有区别吗?
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()
}