【发布时间】:2019-06-06 14:48:46
【问题描述】:
我在注销按钮上有代码,我正在使用defer 语句。
我想知道在操作方法范围内更改 defer 语句代码的位置时。
- 我在方法末尾添加了
defer语句,它向我显示警告。
作用域结束前的'defer'语句总是立即执行; 替换为 'do' 语句以消除此警告
代码:
override func sendButtonTapped(sender: Any) {
self.deleteCoreData()
self.clearUserDefaults()
// Clear view context
AppDelegate.shared.persistentContainer.viewContext.reset()
....
....
// Call after all code execution completed in this block's Scope
defer {
// Set isUserLoggedIn and change root view controller.
UserDefaults.Account.set(false, forKey: .isUserLoggedIn)
AppDelegate.shared.setRootViewController()
}
}
- 然后,我在方法的开头添加了
defer语句,它什么都不显示。
代码:
override func sendButtonTapped(sender: Any) {
// Call after all code execution completed in this block's Scope
defer {
// Set isUserLoggedIn and change root view controller.
UserDefaults.Account.set(false, forKey: .isUserLoggedIn)
AppDelegate.shared.setRootViewController()
}
self.deleteCoreData()
self.clearUserDefaults()
// Clear view context
AppDelegate.shared.persistentContainer.viewContext.reset()
....
....
}
谁能解释一下defer 语句到底发生了什么?
【问题讨论】:
-
把它放在函数的末尾是没有意义的,它只是在 defer 里面移动代码,为什么?
-
您好 Mayur,延迟的行为发生了变化。之前: defer 在函数返回后执行他的代码。示例:返回 1; defer.. 而不是这种行为 defer 现在在函数 return(exit) 之前执行。示例:推迟..返回。所以编译器只是说把你的代码放在延迟中是没有意义的。
-
也就是说,如果我将代码放在
defer中,那么它会在defer之外的代码之前执行? -
不,defer 总是在函数结束之前、return 之前执行,或者如果没有“return”,则在函数中执行最新代码
-
不用说,
defer的主要优点之一是它确保无论您如何退出当前范围(即,如果您有任何提前退出 @ 987654331@ 声明,或者你有什么)。如果您的代码中没有任何return语句,那么defer语句几乎没有什么好处。