www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Objective C protocols

reply John Colvin <john.loughran.colvin gmail.com> writes:
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.
May 16 2020
next sibling parent reply John Colvin <john.loughran.colvin gmail.com> writes:
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.
Based on some experimentation, I'm starting to wonder do protocols actually have any runtime component in Objective C? Because if I pass in an extern(Objective-C) class with the right interface to a function expecting a protocol everything just works.
May 17 2020
parent Jacob Carlborg <doob me.com> writes:
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
May 17 2020
prev sibling parent Guillaume Piolat <firstname.lastname gmail.com> writes:
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.
I did it throught the Obj-C runtime a while ago: https://github.com/AuburnSounds/Dplug/blob/dda1f80d69e8bfd4af0271721738ce827c2f0eae/au/dplug/au/cocoaviewfactory.d#L99 and the result is brittle, you need to replicate the protocol declaration, add all methods etc.
May 17 2020