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)