[swift-users] unsafeBitCast to Unimplemented Class

Andrew Trick atrick at apple.com
Wed Feb 8 02:37:30 CST 2017

> On Feb 7, 2017, at 3:44 PM, Dave Abrahams via swift-users <swift-users at swift.org> wrote:
>> I phrased that as a question because I'm the last person who should be
>> giving advice here... What I had in mind is this:
>> if ([self isKindOfClass:NSClassFromString(@“Bar”)]) {
>>  self.perform(@selector(FakeBarProtocol.foo))
>> }
>> It's not type safe, but it's a lot better than outright lying about
>> the reference's dynamic type.
> Presumably there's a way to express that in Swift, but if it uses
> varargs I expect it's pretty darned inefficient.
> -- 
> -Dave

Um, this is the untyped dispatch in Swift:

>> self.perform(@selector(FakeBarProtocol.foo))

It just wraps a string literal up and sends it to NSObject.perform.

I didn’t get around to rewriting the line above it in Swift...

> if ([self isKindOfClass:NSClassFromString(@“Bar”)]) {

Which is now the next question...

> Also, class_getName(_:) seems to return a UnsafePointer<Int8>, is this just a C-style string? Should I use this over NSStringFromClass or isKindOfClass?

Yes, it returns “raw” C string as an UnsafePointer. I really don’t know these API's, but the other two you mention would seem to avoid Unsafe code. That’s a good thing.

> Yep, it’s not–that’s why I need to go through this trouble :) My plugin is loaded at runtime, so the headers are the best I’ve got (though if you’ve got a way to perform a stricter check, I’m all ears!) Until then, all of these methods appear to be sugarcoating around perform(selector:)–is there any “preferred” way to do this?

I would guess that the right way to do this is to declare an ObjC protocol that will be imported via a bridging header. Whatever types are defined by your plugin should just conform to that protocol.

Beyond that, I’ll have to appeal to others on the list for suggestions.


More information about the swift-users mailing list