Свифт Вложенная попытка в закрытии - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть требование следующим образом

enum CustomError1: Error {
    case errorA
}

enum CustomError2: Error {
    case errorA
}

public func func1(completion: @escaping () -> Void) throws {
    //some code
    if #somecondition {
        throw CustomError1.errorA
    }
    completion()
}

public func func2(completion: @escaping () -> Void) throws {
    //some code
    if #somecondition {
        throw CustomError2.errorA
    }
    completion()
}


func result() {
    do {
        try func1() {
            try self.func2 (){

            }
        }
    } catch {

    }
}

функция результата выдает ошибку, как показано ниже

Invalid conversion from throwing function of type '() throws -> ()' to non-throwing function type '() -> Void'

Это потому, что func1 и func2 выдают разные типы ошибок.

В связи с этим мне нужно написать еще один do catch внутри первого замыкания, как показано ниже

func result() {
    do {
        try func1() {
            do {
                try self.func2 (){

                }
            } catch {

            }
        }
    } catch {

    }
}

Есть ли способ упростить этот вид вложенных попыток захвата

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018
enum CustomError1: Error {
    case errorA
}

enum CustomError2: Error {
    case errorA
}

public func func1(completion: @escaping () throws -> Void) throws {
    //some code
    if true {
        throw CustomError1.errorA
    }
    try completion()
}

public func func2(completion: @escaping () throws -> Void) throws {
    //some code
    if true {
        throw CustomError2.errorA
    }
    try completion()
}


func result() {
    do {
        try func1(completion: {
            try func2 (completion: {

            })
        })
    } catch {

    }
}

Я бы не советовал использовать бросок с дополнениями.Лучший способ - использовать лучшую реализацию завершения.Как то так:

public func func1(completion: @escaping (Error?) throws -> Void) throws {
    //some code
    if true {
        completion(CustomError1.errorA)
    }
   completion(nil)
}
0 голосов
/ 28 ноября 2018

Проблема в том, что аргумент func1 набирается как escaping () -> Void.Это означает, что вы не можете бросить в функцию, которую вы передаете в качестве аргумента.Вы должны были бы набрать это как escaping () throws -> Void.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...