Подтвердить что ты не робот

Что эквивалентно, наконец, в Свифте

Я пытаюсь использовать моделирование обработки ошибок в Swift2.

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

Но похоже, что ключевое слово finally отсутствует. Как я могу достичь try-catch-finally pattern в Swift. Любая помощь приветствуется.

4b9b3361

Ответ 1

Если вы думаете о том, что обработка ошибок SWIFT 2.0 является тем же, что и исключение, вы не понимаете.
Это не исключение, это ошибка, которая соответствует протоколу ErrorType.
Целью блока является перехват ошибки, вызванной функцией или методом throwing.
В принципе нет 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 для выполнения набора операторов непосредственно перед выполнение кода оставляет текущий блок кода. Это позволяет вам необходимую очистку, которая должна выполняться независимо от того, произошла ошибка. Примеры включают закрытие любых открытых файловых дескрипторов и освобождая любую выделенную вручную память.

Ответ 2

defer в Swift 2.0, как и в конце, означает, что swift гарантирует выполнение этого кода отсрочки в конце текущей области действия. Вот некоторые моменты, которые мне нужно знать: 1) Независимо от того, вернется ли защитник 2) мы можем написать несколько отложенных областей

Вот пример и вывод, демонстрирующий несколько перегружателей:

    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")

}
 Output:
 Message one
 Message two
 Message three
 Message four
 Message five
 defered block 1
 defered block 2
 defered block 3

Ответ 3

То, что вы ищете, называется 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, особенно раздел "Указание действий по очистке" .

Ответ 4

Swift 2 вводит свое собственное требование, используя отложить ключевое слово

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

finally= defer в Swift 2.

Статья для defer ключевое слово