On 2020-05-17 11:32, John Colvin wrote:
On Saturday, 16 May 2020 at 19:14:51 UTC, John Colvin wrote:
What's the best way to implement an Objective C protocol in D?

I see mention here https://dlang.org/changelog/2.085.0.html#4_deprecated_objc_interfaces but it's not clear where things are these days.

It's the same these days. It's still not implemented.

Based on some experimentation, I'm starting to wonder do protocols actually have any runtime component in Objective C?

No, not really.

Because if I pass in an extern(Objective-C) class with the right interface to a function expecting a protocol everything just works.

Yes, that works fine.

You can put the methods from the protocol directly in the class that implements them or in a base class. If you really want to have a specific type for the protocol you can use an abstract class to emulate an interface/protocol and cast your actual class to the abstract class:

extern (Objective-C)
abstract class Printer // the protocol
{
    void print(int value) @selector("print:");
}

extern (Objective-C)
class Foo : NSObject
{
    override static Foo alloc() @selector("alloc");
    override Foo init() @selector("init");

    void print(int value) @selector("print:")
    {
        writeln(value);
    }
}

extern (Objective-C) void print(Printer);

void main()
{
    auto foo = Foo.alloc.init;
    print(cast(Printer) cast(void*) foo); // need to cast through void*
}

--
/Jacob Carlborg

Reply via email to