Swift中类似于finally的关键字是什么?

50

我尝试在Swift2中使用错误处理建模。

do {
    try NSFileManager.defaultManager().removeItemAtPath("path")
} catch {
    // ...
} finally {
    // compiler error.
}

但是似乎没有finally关键字。我如何在Swift中实现try-catch-finally模式。欢迎任何帮助。

但是看起来现在没有finally关键字。我该如何在Swift中实现try-catch-finally模式呢?欢迎任何帮助。


2
它是“defer” - 在所有Swift中最重要的事情之一。 - Fattie
1
除了可悲的是,没有人似乎意识到模式人们将需要运行可能在最后抛出代码,但延迟没有这方面的能力。那么怎么办? - uchuugaka
5个回答

43
如果您认为SWIFT 2.0的错误处理与异常是一回事,那么您就误解了。
这不是异常,而是符合一个叫做ErrorType协议的错误。
这个块的目的是拦截由可抛出的函数或方法抛出的错误。
基本上没有finally,您可以将代码包装在defer块中,这保证在作用域结束时执行。
这里有一个来自SWIFT 2的示例编程指南
func processFile(filename: String) throws {
    if exists(filename) {
        let file = open(filename)
        defer {
            close(file)
        }
        while let line = try file.readline() {
            /* Work with the file. */
        }
        // close(file) is called here, at the end of the scope.
    }
}

你���以使用defer语句在代码执行离开当前代码块之前执行一组语句。这使您可以进行任何必要的清理,而无论是否发生错误都应该执行。例如,关闭任何打开的文件描述符和释放任何手动分配的内存。

19
在Swift 2.0中,defer类似于finally,这意味着Swift会确保在当前函数范围结束时执行defer代码。 以下是我需要了解的一些要点:
  1. 即使guard返回,也会执行defer
  2. 我们可以编写多个defer作用域
下面是一个示例和输出,演示了多个defer的用法。
func myMethod()  {
    print("Message one")
    print("Message two")
    print("Message three")
    defer {
        print("defered block 3")
    }
    defer {
        print("defered block 2")
    }
    defer {
        print("defered block 1")
    }
    print("Message four")
    print("Message five")

}

输出:

Message one
Message two
Message three
Message four
Message five
defered block 1
defered block 2
defered block 3

6
你需要的是 defer。它定义了一段代码块,直到执行即将离开当前作用域时才被执行,但它总是会被执行。
func processFile(filename: String) throws {
    if exists(filename) {
        let file = open(filename)
        defer {
            close(file)
        }
        while let line = try file.readline() {
            /* Work with the file. */
        }
        // close(file) is called here, at the end of the scope.
    }
}

更多关于defer的详细信息,请查看Apple Swift文档,特别是“指定清理操作”一节


5

3

Swift 2引入了自己的方法来满足这个要求,使用 defer 关键字。

defer { 
    print("Do clean up here") 
}

finally 在 Swift 2 中等同于 defer

关于 defer 关键字的文章。


12
“finally = defer”并不完全正确。在像C#或Java这样的语言中,try/catch/finally中的finally块将被执行,无论是否有异常发生。这种行为的好处是可以将代码放在finally块中,无论如何都会执行。在Swift中,defer仅在当前范围之后执行,而catch块则位于不同的范围内。因此,“defer”与“finally”并不完全相同。 - dcp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接