Ios 什么';延迟声明和返回前的声明之间的区别是什么?
这两者的区别是什么:Ios 什么';延迟声明和返回前的声明之间的区别是什么?,ios,swift,deferred,Ios,Swift,Deferred,这两者的区别是什么: _ = navigationController?.popViewController(animated: true) defer { let rootVC = navigationController?.topViewController as? RootViewVC rootVC?.openLink(url: url) } return 这是: _ = navigationController?.popViewController(animated:
_ = navigationController?.popViewController(animated: true)
defer {
let rootVC = navigationController?.topViewController as? RootViewVC
rootVC?.openLink(url: url)
}
return
这是:
_ = navigationController?.popViewController(animated: true)
let rootVC = navigationController?.topViewController as? RootViewVC
rootVC?.openLink(url: url)
return
苹果公司的swift指南说:“在代码执行离开当前代码块之前,使用一个DEPER语句执行一组语句。”,但我还是不太明白 在您的示例中,实际上没有区别,但请看以下内容:
func foo(url: URL) -> Int
let fileDescriptor : CInt = open(url.path, O_EVTONLY);
defer {
close(fileDescriptor)
}
guard let bar = something1() else { return 1 }
guard let baz = something2() else { return 2 }
doSomethingElse(bar, baz)
return 3
}
close(fileDescriptor)
始终执行,无论函数返回哪一行。使用defer
可以避免函数结束时的条件清理
考虑这个例子:
class Demo {
var a : String
init(_ a:String) {
self.a = a
}
func finish() {
print("Finishing \(a)")
}
}
func play(_ n:Int) {
let x = Demo("x")
defer { x.finish() }
if (n < 2) {return}
let y = Demo("y")
defer { y.finish() }
if (n < 3) {return}
let z = Demo("z")
defer { z.finish() }
}
play(1)
play(2)
play(3)
这种方法将所有声明放在顶部,并强制您稍后展开选项。另一方面,defer
代码允许您在执行初始化的代码附近编写清理代码
延迟声明和返回前的声明有什么区别
世界上所有的差异。defer
语句在返回后执行!这让你能够完成其他任何方式都无法完成的事情
例如,您可以返回一个值,然后更改该值。苹果经常使用这种技巧;例如,下面是序列文档中显示如何编写自定义序列的代码:
struct Countdown: Sequence, IteratorProtocol {
var count: Int
mutating func next() -> Int? {
if count == 0 {
return nil
} else {
defer { count -= 1 }
return count
}
}
}
如果你写的是
count -= 1
return count
。。。它会破裂;我们不想递减计数
然后返回它,我们想返回计数
然后递减它
另外,正如已经指出的,无论您如何退出,
defer
语句都会执行。无论您退出当前范围,它都会工作,这可能根本不涉及return
<代码>延迟适用于函数体、while块、if构造、do块等。一次返回
并不是退出此范围的唯一方法!您的方法中可能有多个返回
,和/或您可能抛出错误,和/或您可能有中断
,等等,或者您可能只是自然到达范围的最后一行;在每种可能的情况下都会执行延迟
。“手工”编写相同的代码,以覆盖所有可能的退出,可能非常容易出错。DEPER语句用于在执行离开最近的范围之前执行一段代码
例如:
func defer() {
print("Beginning")
var value: String?
defer {
if let v = value {
print("Ending execution of \(v)")
}
}
value = "defer function"
print("Ending")
}
将要打印的第一行是:开始
将打印的第二行是:结束
将要打印的最后一行是:结束延迟函数的执行
var fridgeIsOpen = false
let fridgeContent = ["milk", "eggs", "leftovers"]
func fridgeContains(_ food: String) -> Bool {
fridgeIsOpen = true
defer {
fridgeIsOpen = false
}
let result = fridgeContent.contains(food)
return result
}
fridgeContains("banana")
print(fridgeIsOpen)
使用defer编写一个代码块,该代码块在函数中所有其他代码之后执行,就在函数返回之前。无论函数是否抛出错误,都会执行代码。即使需要在不同的时间执行设置和清理代码,您也可以使用“延迟”将它们相邻地写入。您确定在返回后执行“延迟”语句吗?Swift编程语言指南书上说:“使用DEDER编写一段代码,该代码在函数中所有其他代码之后执行,就在函数返回之前。”它说“在函数返回之前”“。尝试在游乐场中运行,返回后未调用defer语句defer块中的语句在执行离开当前作用域时执行。这与“返回”之前/之后无关。如果函数中没有返回怎么办@Shubham是的,我在第三段也说过。延期执行是因为我们已经离开,不管怎样。看到了吗?您是否按照链接进行了研究@matt这是一个增加int的很好的例子。我想int值是在执行defer语句之前捕获的,而defer语句是在调用代码中的流恢复之前执行的。复制自,没有属性。是的,这是我遇到的最好的例子。
var fridgeIsOpen = false
let fridgeContent = ["milk", "eggs", "leftovers"]
func fridgeContains(_ food: String) -> Bool {
fridgeIsOpen = true
defer {
fridgeIsOpen = false
}
let result = fridgeContent.contains(food)
return result
}
fridgeContains("banana")
print(fridgeIsOpen)