2

在 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' 的无效转换

为什么?

4

2 回答 2

1

添加默认的 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

于 2015-06-14T13:04:52.520 回答
0

我发现了答案(在新的 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
  }
}

问题是“catch”并不详尽,这导致 throw 被传播到封闭函数(它不会“throw”)。

于 2015-06-14T13:39:11.500 回答