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?

I don't think this is the good place for your question. Maybe stackoverflow
or apple developer forum is more suitable.

Did you added the header filename of the category to your bridge file?
Also, is there the method name in the header file as well? You know,
sometimes people wouldn't include the method name in the header but
implementing it directly in the .m file.

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?

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?

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?)

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.

In this case, it's because 'log' only is defined for Float and Double:

log(Double) -> Double
log(x: Double) -> Double
log(x: Float) -> Float

The problem is that Float80 types are represented in C as long double, and currently the importer doesn't import things with long doubles. As a result, logl doesn't get imported which is why it's not seen: