попробуйте в beginSheetModalForWindow

В Swift 2.0, если я сделаю следующее:

panel.beginSheetModalForWindow(self.view.window!) { (result) in

  switch result {
  // Save was selected
  case NSFileHandlingPanelOKButton:
    self.writeFile(fileString, fileURL: panel.URL!)
    // something else was selected
  default:
    break
  }
}

С помощью следующей функции он компилируется и работает.

  func writeFile(fileString: String, fileURL: NSURL) {
    do {
      try fileString.writeToURL(fileURL, atomically: true, encoding: NSUTF8StringEncoding)
    } catch let error as NSError {
      fatalError("Error writing to file - \(error)")
    }
  }

НО, если я комбинирую два вот так:

panel.beginSheetModalForWindow(self.view.window!) { (result) in
  switch result {
  // Save was selected
  case NSFileHandlingPanelOKButton:
    do {
      try fileString.writeToURL(fileURL, atomically: true, encoding: NSUTF8StringEncoding)
    } catch let error as NSError {
      fatalError("Error writing to file - \(error)")
    }
    // something else was selected
  default:
    break
  }
}

Он не будет компилироваться. Я получаю ошибку компилятора:

Неверное преобразование из функции генерации типа '() throws ->' в функцию без генерации типа '(Int) -> Void'

Почему?


person DougPA    schedule 14.06.2015    source источник


Ответы (2)


добавить блок catch по умолчанию следующим образом:

do {
      try fileString.writeToURL(fileURL, atomically: true, encoding: NSUTF8StringEncoding)
} catch let error as NSError {
      fatalError("Error writing to file - \(error)")
} catch {

}

http://www.hackingwithswift.com/new-syntax-swift-2-error-handling-try-catch

person Bannings    schedule 14.06.2015

Я обнаружил ответ (на новых форумах разработчиков Apple).

Если вы делаете это так, это работает:

panel.beginSheetModalForWindow(self.view.window!) { (result) in
  switch result {
  case NSFileHandlingPanelOKButton:
    // Save was selected
    do {
      try fileString.writeToURL(panel.URL!, atomically: true, encoding: NSUTF8StringEncoding)
    } catch let error as NSError {
      fatalError("Error writing to file : \(error)")
    } catch {
      fatalError("Error")
    }
  default:
    // something else was selected
    break
  }
}

Проблема заключалась в том, что «улов» не был исчерпывающим, что приводит к распространению броска до закрывающей функции (которая не «выбрасывает»).

person DougPA    schedule 14.06.2015