【问题标题】:do try in beginSheetModalForWindow试试 beginSheetModalForWindow
【发布时间】:2015-06-14 11:24:17
【问题描述】:

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

为什么?

【问题讨论】:

    标签: swift error-handling swift2


    【解决方案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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-07-31
        • 1970-01-01
        • 1970-01-01
        • 2019-07-27
        • 2018-08-31
        • 1970-01-01
        • 2017-10-10
        相关资源
        最近更新 更多