Я реализовал следующую функцию как расширение массива логических значений, которая могла вызвать ошибку CustomError
:
enum CustomError: Error {
case empty
case doesNotContainTrue
}
extension Array where Element == Bool {
func indexOfFirstTrue() throws -> Int {
if isEmpty { throw CustomError.empty }
guard let detectedIndex = index(of: true) else {
throw CustomError.doesNotContainTrue
}
return detectedIndex
}
}
который работает так, как ожидалось:
let myArray = [false, true, false, true]
try print(myArray.indexOfFirstTrue()) // 1
Затем я попытался объявить функцию как:
func handleResult(_ index: Int) throws {
print(index * 2)
// ...
}
который должен взять результат myArray.indexOfFirstTrue()
и что-то с ним сделать (для простоты предположим, что он печатает значение, умноженное на 2):
try handleResult(myArray.indexOfFirstTrue()) // 2
Что я хочу сделать, так это объявить handleResult
как функция повторного броска:
Функция или метод могут быть объявлены с ключевым словом rethrows, чтобы указать, что они выдают ошибку, только если один из ее параметров функции выдает ошибку. Эти функции и методы известны как функции повторного генерирования и методы повторного генерирования. Функции и методы повторного генерирования должны иметь по крайней мере один параметр функции генерирования.
Язык программирования Swift (Swift 4.1): Объявления — повторное создание функций и методов.
Поэтому я могу вызвать его с помощью формулы без выбрасывания, поэтому он не будет выдавать ошибку:
handleResult(myArray.indexOfFirstTrue()) // 2
Но я застрял в том, что я должен отредактировать, чтобы это была функция повторного броска, поэтому я попытался объявить ее как:
func handleResult(_ index: Int) rethrows {
print(index * 2)
}
и я получил ошибку:
ошибка: функция 'rethrows' должна принимать аргумент функции броска
поэтому я также попытался объявить это как:
func handleResult(_ index: (() throws -> Int)) rethrows {
print(index * 2)
}
и, очевидно, получил ошибку:
ошибка: невозможно преобразовать значение типа «Int» в ожидаемый тип аргумента «() throws -> Int»
Что мне делать в этот момент?
handleResult
должен перебрасывать? Насколько я могу судить, вы просто хотите, чтобыindexOfFirstTrue
бросил. Вы бы по-прежнему называли этоtry handleResult(myArray.indexOfFirstTrue())
. - person Hamish   schedule 05.04.2018detectedIndex
может быть упрощена доguard let detectedIndex = index(of: true) else { throw CustomError.doesNotContainTrue }
. - person Hamish   schedule 05.04.2018