1

我创建了一个自定义 Xcode 编辑器扩展,如果未满足某些条件,它可能无法运行。

具体来说,它是一个排序行命令,如果有多个选择,或者选择的行少于两行,它将拒绝运行。

我已经定义了一个符合错误的枚举来定义我的错误也符合 LocalizedError。

enum CommandError: Error, LocalizedError
{
  case notEnoughLines
  case tooManySelections

  public var errorDescription: String?
  {
    switch self
    {
    case .notEnoughLines:     return NSLocalizedString("Not enough lines to sort", comment: "notEnoughLines")
    case .tooManySelections:  return NSLocalizedString("Too many selections", comment: "tooManySelections")        
    }
  }
}

在我的 perform(with:completionHandler:) 方法中,我使用适当的错误之一调用完成处理程序:

...
if invocation.buffer.selections.count > 1
{
  completionHandler(CommandError.tooManySelections)
  return
} 
...

我期待显示错误的文本(“选择太多”)。相反,错误显示为:

操作无法完成。(Ext01.SortLinesCommand.CommandError 错误 1。)

我这样做是否不正确,或者这是 XcodeKit 或 Xcode 中的问题?

4

1 回答 1

1

我在我的linkedIn 个人资料上为Xcode 扩展创建了一篇文章。这里的问题是 Error 是协议而 NSError 是对象。您不能将错误协议传递给完成处理程序,但您必须在其中传递 NSError 实例。之前也有点迷茫。

如果你像这样创建 NSError 实例

  var userInfo: [AnyHashable : Any] = [
        NSLocalizedDescriptionKey :  NSLocalizedString(
            "Finally! This works!",
            value: "Finally! This works!",
            comment: ""
        ),
        NSLocalizedFailureReasonErrorKey : NSLocalizedString(
            "Finally! This works!",
            value: "Finally! This works!",
            comment: ""
        )
    ]

 let error = NSError(
    domain: "", 
    code: 666,
    userInfo: userInfo
  )
  // And pass it to completion like this, it will work
  completionHandler(error)

查看我的文章以进一步了解此问题:

https://www.linkedin.com/pulse/xcode-extension-defining-enum-variables-swift-moreerror-bucher/

如果你只是对错误感到好奇,Cmd+f 对文章这个关键字:

I haven't seen any extension with passing error

于 2018-01-11T00:25:33.290 回答