D言語からObjective-CとCocoaAPIを使いたい

string 関係 の API を分離してみました

サンプルコード

Powered by Prism

cocoa/strings.d

/**
 *      cocoa/strings.d      Version 0.0.3
 */
module cocoa.strings;
import core.attribute : optional, selector;
import std.conv : to;

extern (Objective-C)
extern class NSObject {
    static NSObject alloc() @selector("alloc");
    NSObject init() @selector("init");
    SEL perform(SEL) @selector("performSelector:");
    void release() @selector("release");
}

extern (Objective-C)
extern class NSString : NSObject { 
    override static NSString alloc() @selector("alloc");
    override NSString init() @selector("init");
    NSString initWithBytes(
        const(ubyte)* bytes,
        NSUInteger length,
        NSStringEncoding encoding
    ) @selector("initWithBytes:length:encoding:");
    NSString init(char*) @selector("initWithUTF8String:"); // 
    NSString initWith(char*)	@selector("initWithUTF8String:"); //
    NSString initWith(NSString) @selector("initWithString:");
    NSString init(NSString) @selector("initWithString:");
    char* UTF8String() @selector("UTF8String");
    override void release() @selector("release");
    void draw(NSPoint, NSDictionary) @selector("drawAtPoint:withAttributes:");
    void drawAtPoint(NSPoint, NSDictionary) 
        @selector("drawAtPoint:withAttributes:");
    double doubleValue(NSString) @selector("doubleValue:");
    int intValue(NSString) @selector("intValue:");
    int length() @selector("length");
    NSRange rangeOfString(NSString) @selector("rangeOfString:");
    NSString substr(NSRange) @selector("substringWithRange:");
} 

NSString substr(NSString str, int a, int b) {
    return str.substr(NSRange(a, b));
}

NSString toNSString(string str) {
    return NSString.alloc.initWithBytes(
        cast(immutable(ubyte)*) str.ptr,
        str.length,
        NSStringEncoding.NSUTF8StringEncoding
    );
}

enum NSStringEncoding : NSInteger { NSUTF8StringEncoding = 4 }

NSString toNs(string str) { return toNSString(str); }
NSString toNs(char* cstr) { return NSString.alloc.init(cstr); }
string toDs(NSString str) { return str.toCs.to!string; }
string toDs(char* str) { return str.to!string; }
char* toCs(NSString str) { return str.UTF8String; }
// char* toCs(string str) { return cast(char*) str; } //
char* toCs(string str) { return str.toNs.toCs; } // 
NSString strCopy(NSString str) { return NSString.alloc.init(str); } 

extern (C) void NSLog(NSString, ...);

struct objc_selector;
alias SEL = objc_selector*;
extern (C) SEL sel_registerName(char* str); // 

alias NSUInteger = size_t;    // ulong = 8 Byte
alias NSInteger  = ptrdiff_t;  // long = 8 Byte
struct CGColor;
alias CGColorRef = CGColor*;
alias CGFloat    = double; // 8bit

struct NSPoint {
    CGFloat x;
    CGFloat y;
}

struct NSRange {
    NSUInteger location;
    NSUInteger length;
}

pragma(inline, true) NSRange NSMakeRange(NSUInteger loc, NSUInteger len) {
    NSRange r;
    r.location = loc;
    r.length = len;
    return r;
}

/* NSDictionary */
extern (Objective-C)
extern class NSDictionary : NSObject {
    static NSDictionary dictionary() @selector("dictionary");
    static NSDictionary dic(NSArray, NSArray) 
        @selector("dictionaryWithObject:forKeys:");
    NSString strForKey(NSString) @selector("objectForKey:");
    NSString key(NSString) @selector("objectForKey:");
    NSMutableDictionary copy() @selector("mutableCopy");
    NSUInteger count() @selector("count");
}

extern (Objective-C)
extern class NSMutableDictionary : NSDictionary {
    override static NSMutableDictionary dictionary() @selector("dictionary");
    NSMutableDictionary setObjKey(NSString, NSString) @selector("setObject:forKey:");
    NSString objKey(NSString) @selector("objectForKey:"); // keyの要素の取得
    void removeKey(NSString) @selector("removeObjectForKey:"); // keyの要素を削除
    void removeAll() @selector("removeAllObjects"); // 全要素を削除
    NSDictionary copy() @selector("copy");
}

/* NSArray */
extern (Objective-C)
extern class NSArray : NSObject {
    static NSArray array() @selector("array");
    static NSArray array(NSArray) @selector("arrayWithArray:");
    static NSArray array(NSString) @selector("arrayWithObject:");
    static NSArray array(NSString, NSUInteger) @selector("arrayWithObjects:count:");
    override NSArray init() @selector("init");
    NSArray init(NSArray) @selector("initWithArray:");
    NSArray init(NSArray, bool) @selector("initWithArray:copyItem:");
    NSInteger count() @selector("count");
    NSString atIndex(NSUInteger) @selector("objectAtIndex:");
    NSString strAtIndex(NSUInteger) @selector("objectAtIndex:");
    NSDictionary dicAtIndex(NSUInteger) @selector("objectAtIndex:");
    NSArray arrayAtIndex(NSUInteger) @selector("objectAtIndex:");
    NSMutableArray copy() @selector("mutableCopy");
    NSMutableArray muCopy() @selector("mutableCopy");
    NSNumber objectAtIndex(NSUInteger) @selector("objectAtIndex:");
}

extern (Objective-C)
extern class NSMutableArray : NSArray {
    override static NSMutableArray alloc() @selector("alloc");
    override static NSMutableArray array() @selector("array");
    override NSMutableArray init() @selector("init");
    void addObject(NSNumber) @selector("addObject:");
    void addArray(NSArray) @selector("addObjectsFromArray:");
    void add(NSMutableArray) @selector("addObjectsFromArray:");
    void add(NSString) @selector("addObject:");
    void insert(NSObject, NSUInteger) @selector("insertObject:atIndex:");
    NSArray copy() @selector("copy");
    override NSNumber objectAtIndex(NSUInteger) @selector("objectAtIndex:");
}

extern (Objective-C)
extern class NSURL : NSObject { 
    static NSURL url(NSString) @selector("URLWithString:"); // NSString -> NSURL
    NSURL init(NSString) @selector("initWithString:");
    NSURL url(string s) { return NSURL.url(s.toNs); }  
    NSString abString() @selector("absoluteString"); // NSURL -> NSString
}

extern (Objective-C)
extern class NSError : NSObject {}

extern (Objective-C)
extern class NSValue : NSObject {}

/* NSNumber */
extern (Objective-C)
extern class NSNumber : NSValue {
	override static NSNumber alloc() @selector("alloc");
	NSNumber initWithInt(int) @selector("initWithInt:");
	NSNumber init(int) @selector("initWithInt:");
	int intValue() @selector("intValue");
	int toInt() @selector("intValue");
	uint unsignedIntValue() @selector("unsignedIntValue");
	uint toUint() @selector("unsignedIntValue");
	long longValue() @selector("longValue");
	long toLong() @selector("longValue");
	ulong unsignedLongValue() @selector("unsignedLongValue");
	ulong toUlong() @selector("unsignedLongValue");
	NSString stringValue() @selector("stringValue");
}

string toStr(NSNumber nsN) {
	return nsN.stringValue.toDs;
}