2017-08-15 76 views
0

我创建了一个定制的Xcode编辑器扩展,如果某些条件未得到满足,它可能无法运行。Xcode不显示来自自定义编辑器扩展的错误文本

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

我已经定义了符合错误的枚举来定义我也符合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")   
    } 
    } 
} 

在我执行(附:completionHandler :)我称之为完成处理器与错误之一是适当的:

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

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

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

上午我错误地这样做,或者这是XcodeKit或Xcode中的问题吗?

回答

0

我在我的linkedIn配置文件中为Xcode扩展名创建了一篇文章。这里的问题是Error是协议,而NSError是对象。您不得将Error协议传递给完成处理程序,但您必须在其中传递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

+0

谢谢你。我会在下次启动Xcode时尝试它(目前正在处理其他内容)。 –