Swift 'defer' 关键字导致分段错误
Swift 'defer' keyword causes Segmentation Fault
这是在一个全新的 Xcode 项目中发生的。我添加的第一个 class 是 UIView
的子 class,它工作正常,如下所示:
class CIHomeView: UIView {
init() {
super.init(frame: CGRectZero)
print("test")
}
但是,一旦我添加延迟:
class CIHomeView: UIView {
init() {
defer { super.init(frame: CGRectZero) }
print("abc")
}
我收到分段错误编译错误。此外,Xcode 的语法突出显示会暂时停止工作。很奇怪。我的理解是从Swift 2.0开始可以使用defer,而我确实是运行 Swift 2.2.
defer
在 init
方法中是非法的。编译器很想告诉你,但它在这样做之前就崩溃了。
table 上有一项提议,在即将到来的 Swift 3 迭代中解决此问题,并允许 defer
在某些情况下在此上下文中工作,因为这样做有充分的理由;但在那之前,不要这样做。
您肯定 永远不会 被允许在您的 defer
中调用 super
,但是,因为这将完全违反调用顺序的规则事情必须在初始化期间完成。您正在尝试做的特定事情是一个糟糕的想法。编译器知道以安全和一致的方式进行初始化的规则;听编译器。
这是在一个全新的 Xcode 项目中发生的。我添加的第一个 class 是 UIView
的子 class,它工作正常,如下所示:
class CIHomeView: UIView {
init() {
super.init(frame: CGRectZero)
print("test")
}
但是,一旦我添加延迟:
class CIHomeView: UIView {
init() {
defer { super.init(frame: CGRectZero) }
print("abc")
}
我收到分段错误编译错误。此外,Xcode 的语法突出显示会暂时停止工作。很奇怪。我的理解是从Swift 2.0开始可以使用defer,而我确实是运行 Swift 2.2.
defer
在 init
方法中是非法的。编译器很想告诉你,但它在这样做之前就崩溃了。
table 上有一项提议,在即将到来的 Swift 3 迭代中解决此问题,并允许 defer
在某些情况下在此上下文中工作,因为这样做有充分的理由;但在那之前,不要这样做。
您肯定 永远不会 被允许在您的 defer
中调用 super
,但是,因为这将完全违反调用顺序的规则事情必须在初始化期间完成。您正在尝试做的特定事情是一个糟糕的想法。编译器知道以安全和一致的方式进行初始化的规则;听编译器。