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