UIAlert Невозможно преобразовать значение типа '(_) throws -> ()' в ожидаемый тип аргумента '((UIAlertAction) -> Void)?' - PullRequest
0 голосов
/ 30 июня 2018

Я искал решения проблемы, которая возникла с кодом в UIAlertAction. Я хочу обновить значение в базе данных SQLite с истинного на ложное для данного числа. Мне удалось заставить циклы if / else работать, поэтому я знаю, что попал в нужное место. Но когда я пытаюсь выполнить запрос на обновление базы данных из UIAlertAction, я получаю вышеуказанную ошибку.

Код ниже:

} else {
    print ("Badge in School - check out")
    let checkOut = UIAlertController(title: "Sign Out?", message: "Click on the 'Sign Out' button below to end your visit", preferredStyle: .alert)

    let signOut = UIAlertAction(title: "Sign Out", style: .destructive) { (UIAlertAction) in
        print ("Set Badge State to false")

        let badgeOut = self.badgeTable.filter(self.badgeNumber == badgeNumberInt!)
        let badgeOutUpdate = badgeOut.update(self.badgeIn <- false)

        try self.myData.run(badgeOutUpdate)
    }

    let cancel = UIAlertAction(title: "Cancel", style: .cancel)

    checkOut.addAction(signOut)
    checkOut.addAction(cancel)

    present (checkOut, animated: true, completion: nil)
}

Если я изменю:

try self.myData.run(badgeOutUpdate)

до

try! self.myData.run(badgeOutUpdate)

код работает и делает именно то, что я ожидал.

Любые объяснения или указатели на документы, которые могут объяснить это идиоту, как я, будут с благодарностью приняты!

Ответы [ 2 ]

0 голосов
/ 30 июня 2018

Метод run, который вы вызываете, может вызвать исключение, но закрытие действия предупреждения не ожидает возникновения исключения. Вы должны обработать исключение, потому что действие предупреждения не настроено, чтобы исключение всплыло. Когда вы добавляете! в попытке вы говорите: «сделайте это, и если произойдет исключение, завершите работу приложения». Другая альтернатива - заключить его в блок do-catch:

do {
    try self.myData.run(badgeOutUpdate)
} catch {
    // Handle the exception here
}

Если возникнет исключение, он выполнит блок catch. Если нет, улов будет игнорироваться. Другой вариант - использовать следующее:

try? self.myData.run(badgeOutUpdate)

Это выполнит вызов, который может бросить. Если этот вызов вызывает исключение, он молча завершается неудачно, и ваша программа продолжается. В некоторых случаях это может быть хорошо, или это может означать, что в вашей программе больше ничего не будет работать.

Каждая ситуация индивидуальна, выберите наиболее подходящую для вас: аварийное завершение при исключении, обработка исключения, тихая ошибка.

Документация Swift довольно хорошо описывает это: https://docs.swift.org/swift-book/LanguageGuide/ErrorHandling.html

0 голосов
/ 30 июня 2018

Вам нужно do-catch блок

do {
      try self.myData.run(badgeOutUpdate)
  }
catch {
       print(error)
}
...