Search code examples
swiftswift-extensionsxcode-extension

XCSourceEditorCommandInvocation swift extension causes "unrecognized selector sent to instance" exception


When I try and add swift extensions to classes in XcodeKit (framework for adding Xcode extensions) the compiler is happy to build without any errors, but when the code runs I get the following exception:

-[XCSourceEditorCommandInvocation test]: unrecognized selector sent to instance 0x7fc60543f2b0

Below is sample code which can reproduce the exception:

class SourceEditorCommand: NSObject, XCSourceEditorCommand {
    func perform(with invocation: XCSourceEditorCommandInvocation, completionHandler: @escaping (Error?) -> Void ) -> Void {
        // Call extension method
        invocation.test() // <--- Exception thrown here

        completionHandler(nil)
    }
}

extension XCSourceEditorCommandInvocation {
    func test() {
        print("it works!")
    }
}

I've extended ObjC classes in swift in the past without any issues so I'm a bit stuck here.

I've tried:

  • adding @objc before the method declaration.
  • adding public to the extension and method.
  • I'm not extending a class cluster so it's likely not this question.
  • I'm not extending a protocol so it's likely not this question.

Solution

  • Neither Objective-C categories nor Swift extensions are supported on the classes or types in XcodeKit.framework at this time.