On 2015-10-23 17:53, Kagamin wrote:

A little of massage and you get:

struct ClassStorage(C)
{
   alias lookUp this;
   C lookUp() immutable
   {
     return cast(C)objc_lookUpClass(C.stringof);
   }
}

immutable ClassStorage!NSString cNSString;

C alloc(C)()
{
   immutable ClassStorage!C c;
   return c.alloc();
}

void main()
{
   auto str = cNSString.alloc.initWithUTF8String("Hello World!");
   auto str1 = alloc!NSString.initWithUTF8String("Hello World!");
   NSLog(str);
   str.release();
   str1.release();
}

In theory this could work:

extern (C) void NSLog(NSString, ...);
extern (C) Class objc_lookUpClass(in char*);

extern (Objective-C)
interface Class
{
    // prefix with an underscore to avoid conflict with the class
    // method in NSObject
    NSObject _alloc() @selector("alloc");
}

extern (Objective-C)
interface NSObject : Class
{
    // prefix with an underscore to avoid conflict with the
    // free function
    NSObject _init() @selector("init");

    static T alloc(this T)()
    {
        // The cast to void* is necessary to bypass the runtime
        // because casting is not yet implemented for Objective-C
        // classes
        return cast(T) cast(void*) objc_lookUpClass(T.stringof)._alloc;
    }
}

// Use a free function and UFCS because the @selector attribute is not
// allowed on template methods
auto init (T : NSObject)(T obj)
{
    return cast(T) obj._init();
}

extern (Objective-C)
interface NSString : NSObject
{
NSString initWithUTF8String(in char* str) @selector("initWithUTF8String:");
}

void main()
{
    auto str = NSString.alloc.initWithUTF8String("Hello World!!");
    auto str2 = NSString.alloc.init;
    NSLog(str);
}

The above could work, and in my opinion should work. But the "this T" for static methods don't work.

--
/Jacob Carlborg

Reply via email to