[swift-users] NSDictionary passed through Swift loses access to category methods

Greg Parker gparker at apple.com
Wed May 24 20:03:19 CDT 2017

> On May 23, 2017, at 1:10 PM, Russell Finn via swift-users <swift-users at swift.org> wrote:
> I'm having an issue with an NSDictionary that is passing through Swift code and back to Objective-C losing access to a method implemented by a category on NSDictionary. There is clearly some subtlety about bridged dictionaries that I'm missing, and I'd appreciate any clarification that the list can provide.
> Specifically: I have a Swift 3 application that uses some legacy Objective-C classes.  One of these classes relies on a category on NSDictionary that implements a method called `-boolValueForKey:`.  
> In the main application, the Swift code calls a method on a remote object proxy that returns an NSDictionary, which get bridged back to a Swift dictionary (`[AnyHashable: Any]`).  This bridged dictionary is passed to a method on the legacy Objective-C class that calls the `-boolValueForKey:` method from the category.  At this point, a runtime exception occurs that says the dictionary object (which at this point is a `_SwiftDeferredNSDictionary`, according to the debugger) doesn’t recognize the selector `-boolValueForKey:`.
> I can work around the issue in my code by modifying the legacy Objective-C class and inlining the implementation of `-boolValueForKey:` — but is there a better general approach?

This should work. _SwiftDeferredNSDictionary is a subclass of NSDictionary and should inherit all of NSDictionary's categories.

What is the exact exception you get?

Greg Parker     gparker at apple.com <mailto:gparker at apple.com>     Runtime Wrangler

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-users/attachments/20170524/ec7dee0f/attachment.html>

More information about the swift-users mailing list