ObjecTips

Swift & Objective-C で iOS とか macOS とか

OSType, FourCharCode から NSString への変換

いろいろデバッグしていて OSTypeFourCharCode を扱う事があるので備忘。

OS Xだと Foundation.framework に NSFileTypeForHFSTypeCode という便利な関数が用意されている。
この関数はシングルクォーテーションで囲われた文字列を生成する。

    OSType type = 'appl';
    NSLog(@"type = %@", NSFileTypeForHFSTypeCode(type));
    // type = 'appl'


もう1つ、CoreServices.framework の LaunchServices.framework に UTCreateStringForOSType という関数がある。
返り値は CFStringRef なので、release するのを忘れないようにしなければならない。
こちらはシングルクォーテーション無しで文字列を生成してくれる。

    OSType type = 'appl';
    NSLog(@"type = %@", CFBridgingRelease(UTCreateStringForOSType(type)));
    // type = appl


これらの関数はどちらもOS X用のものでiOSでは使えない。
UTCreateStringForOSTypeiOS では MobileCoreServices.framework の UTType.h に載ってはいるけど __OSX_AVAILABLE_STARTING(__MAC_10_3,__IPHONE_NA); となっている。

という事でiOSでは自前で変換を行ってやる必要がある。

    OSType type = 'appl';
    unichar c[4];
    c[0] = (type >> 24) & 0xFF;
    c[1] = (type >> 16) & 0xFF;
    c[2] = (type >> 8) & 0xFF;
    c[3] = (type >> 0) & 0xFF;
    NSString *string = [NSString stringWithCharacters:c length:4];
    NSLog(@"type = %@", string);

マルチプラットフォームなライブラリを作る場合はこれを関数化してiOS, OS X共にこの自前実装を呼び出すようにするといいかも知れない。