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)")
    }
  }

しかし、この2つを次のように組み合わせると:

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 Developer フォーラムで)。

このようにすると、次のように機能します。

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
  }
}

問題は、「キャッチ」が網羅的ではなかったため、スローが外側の関数 (「スロー」しない) まで伝播されることでした。

于 2015-06-14T13:39:11.500 に答える