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

Russell Finn rsfinn at gmail.com
Thu Jun 1 18:28:28 CDT 2017

Greg -- Thanks for your interest and sorry for not getting back to you
sooner.  When faced with a deadline last week, I simply modified the legacy
class to run the implementation of the category method `-boolValueForKey:`,
as I suggested.

Now that I have a brief opportunity, I tried to reproduce the failure in a
test project, and naturally I couldn't.  (I did a dummy implementation of
the remote object proxy that created an NSDictionary and passed it to a
handler block. This mimics the original code, where the dictionary is being
returned as the result of an XPC call to another process.)

If I get a chance to resurrect the original implementation so I can record
the exact runtime exception message, I will. Right now I'm busy preparing
to go to WWDC for the first time in a decade. (Will you be available, by
any chance?)

Thanks again -- Russell

On Wed, May 24, 2017 at 6:03 PM, Greg Parker <gparker at apple.com> wrote:

> 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     Runtime Wrangler
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-users/attachments/20170601/890e3298/attachment.html>

More information about the swift-users mailing list