CocoaのFrameworkでSTLを使ってみる

最近Cocoaにはまっています。Windows用に作成したライブラリをMacへ移植してみたのですが意外とはまったのでメモ

環境

  • MacOX10.9
  • XCode 5

TestAppという単純なアプリを作成しその中からSTLで作成したFrameworkを呼ぶことにするサンプルです。

UtilsというなのFramework

まず、ライブラリの作成です。XCodeでOSX用のCocoaFrameworkを作成します。

作成した後にファイルの追加で以下のヘッダファイルとC++ファイルを追加します

  • Test.h

  • Test.cpp

ついでにObjective-Cのクラスも追加します。こちらを参考に

  • Utils.h

  • Utils.m

それぞれのヘッダファイルをPublickにしたのちに、コンパイルするのですが、Build Rulesの Apple LLVM 5.0 Language C++のC++ Language Dialect を -std=c++11へ、C++ Standard Libraryを libc++(LLVM C++ standard library with C++ 11 supportへ変更します。また Apple LLVM 5.0 Language のCompile Source As をObjective-C++へと変更しておきます。

これでコンパイルOKのはず

TestAppというアプリ作成

OSXのApplicationのCocoaApplicationからプロジェクトを作成し、テキストボックスとボタンを配置しておきます。また、プロジェクトのFrameworksに先ほど作成したUtilsのフレームワークを追加しておきます。

  • AppDelegate.h

  • AppDelegate.m

先ほどのライブラリと同様にBuildSettingを変更しておきます。

これでコンパイルとリンクがOKのはず。。

ボタンを押すとライブラリで計算した値がテキストボックスに出るはずです

Mac用アプリの自動テスト

最近自動テストツールにはまっています。

さすがにはやりというかiOSやAndroid用のテストツールは山ほど(というほどでもありませんが)有るのですが、Macのアプリ用のテストツールはほとんど有りません。

ちなみにこちらにまとめて書いてあるので参考になります

http://iphone-dev.g.hatena.ne.jp/laiso/20120111/1326280021

KIFのMac版が有るとのことなのでちょっと試してみました。

こちらのサイトを参考に

http://d.hatena.ne.jp/laiso+iphone/20121013/1350134198

環境

  • MacOS10.9
  • Xcode 5

この組み合わせで少しはまりました。

http://d.hatena.ne.jp/laiso+iphone/20121013/1350134198

こちらのサイトのサンプルであるGITHubからダウンロードします

https://github.com/laiso/Mac-Samples/tree/master/KIFMac01

このままではKIFがとれないので別途取得します

先ほど取得したサンプルに上書きします

Xcodeを起動しプロジェクトを取り込みます

IntegrationTestのターゲットを選んで実行。しても止まってしまいます。

ログを見ると、

どうやらアクセシビリティがだめな模様。

システム環境設定のアクセシビリティを見ても設定項目なし。。

http://www.tekrevue.com/how-to-enable-access-for-assistive-devices-in-os-x-mavericks/

こちらに答えが書いていました。

システム環境設定のセキュリティとプライバシーの中から、プライバシータグのアクセシビリティにXCodeのチェックボックスをオン

これでサンプル通りに動きました

OpenGLで文字列

OpenGLで文字列を描画したく、いろいろ探してみたのですが、みんな苦労しているみたいです。

とりあえずわかったことが2つ、日本語はちょっと難しい。

  • まずGLUTを使うやり方

これの場合、日本語は描画できません。ただし簡単に書くことができます

http://d.hatena.ne.jp/osyo-manga/20110827/1314417606

こちらのサイトを参考に

  • テクスチャを使うやり方

日本語を表示したい場合にはテクスチャを使うみたいです。結構重いとのことなので決まった文字列の場合には画像をそのまま貼付けた方が良さそうです

http://null-null.net/blog/2007/10/566.php

こちらのサイトを参考に

ちょっといい加減ですがこんな感じ

NSNumberの拡張?

どうもCocoaプログラミングでは通常のC言語のような数値配列を使うことはできなさそう。

NSNumberとNSMutableArrayを駆使して書くのが一般的みたいです。

ただ、NSNumberだと一回作ったオブジェクトの値がどうやら変更不可らしい。

これでは数値計算には使えません。

そこでNSNumberを拡張してみました

@interface MYNUmber:NSNumber{

}

@property(readwrite)float floatValue;

@property(readwrite)bool boolValue;

@property(readwrite)int intValue;

@property(readwrite)double doubleValue;

@end

これでとりあえずコンパイルは通りました

initialization method -initWithInt: cannot be sent to an abstract object

が、allocする際に何やらエラー。。

まだ道のりは遠い。。