sci

最果て風呂

あまい果実

まえがき

Visual StudioC# で手軽に GUI アプリケーションを作成できた事に味を占めた奈幾乃は、自身のメインマシンである iBook でも GUI アプリケーションを作成し、かつ常用したいが為に XCode に手を出してしまったのだった。

この Xcode は Interface Builder が統合される前のもので、新しいマシンを手にした暁には再度勉強をやり直さなければならない事がわかっているにもかかわらず、手を出さずにはいられなかったのだ。なぜなら、コマンドラインで入力するよりも GUI ボタンで変換できた方が便利なんだもん。

RubySinatra による Web アプリケーションを作成した頃から、この「やっぱ GUI は便利やわ」というものぐさの兆候は出始めていた。もちろんプログラムの用途によって要求されるものは異なるのだが、今自分が求めているものは Cocoa アプリなのである。

奈幾乃は林檎を齧った。が、その瞬間から苦痛に苛まれることになった。Objective-C軽量プログラミング言語C# とはわけが違う...。しまった、毒入りだったか...。

BecomeAnXcoder を読んで Cocoa アプリケーション作成の初歩を学んだ。この文章は(一部読み難い部分があるものの)かなり良く出来ており、自分には最良の入門書となった。日本語訳がなされていなければキックオフすることは出来なかっただろう。原著者および飜訳者に感謝致します。

サンプルの Cocoa プログラムは自分の環境(Ver1.1)でも動き、GUI アプリケーション作成のおおまかな手順は理解できた(と思う)。しかし肝心の内部処理については Objective-C を理解しなければならないため、そう易々と完成させることは出来そうにない。

というわけで、しばらくは Command Line Tool を作りながらいろいろと勉強していくことにする。優先的に知るべきものは下記になるのではないかと思う。ポインタは分っているつもりだけど怪しいレベル。

  • ファイルの読み込み・書き込み(辞書ファイルから読み込む)
  • 二次元配列の作成(連想リスト的なもの。Rubyのように順序を保つならhashでも良い)
  • 文字列の検索・置換(文字列の置き換え)
  • foreach 等による繰り返し(やっぱり while を使うのかな)
  • スコープ(辞書の寿命。現状ではボタンを押す度に作り直したい)

ここはそんな奈幾乃のメモ置きです。

文字列

NSString は変更できない。NSMutableString は変更できる。immutable というのは Python でタプルを使った時にはじめて知った概念だった。Python は普段使いはしてないけど触っておいて良かった。

NSString で宣言する場合は * を付ける。ポインタだけど難しく考えることはなく、文字列を使う時は * を付けるとだけ覚えておけば良い。また、オブジェクトであることを強調(という訳ではないけど)するために文字列の前に @ を付ける。そんなものだと思っておけば良い。

メソッドの適用方法がおもしろい。ドットで繋げるやり方に慣れているので困惑気味。「オブジェクトに対してメッセージを送信する」という表現がなされているので、メソッドの適用と言っては間違いなのかもしれない。

NSString *homu;          homu という変数を入れる箱を作成(すでにオブジェクト?)
homu = @"ほむほむ";      メモリ上のどこかにある"ほむほむ"のアドレスを格納
nagasa = [homu length];  homu に「length どんだけ?」と尋ねて nagasa に格納
NSLog(@"%d", nagasa);    nagasa をログに出力

4 を期待していたけど 12 になっちゃった。unicode が 3 バイトだからでしょうか?ASCII とマルチバイトをどうやって判別すれば良いのかな?むむっ、4 バイトで表現される漢字の旧字体もあるから単純に 3 を掛けるという方法は使えないか。XCode の実行ウインドウの日本語が文字化けするのはフォント設定がおかしいから?

NSMutableString で初期化する時は下記のように mutableCopy という余計なものを付けないといけないらしい。面倒。

NSMutableString *mami
mami = [@"まみまみ" mutableCopy];

日本語が出ないよぉ。うわ、文字列に関する部分の説明が短か〜い。

配列

ちょっとわからん。何でブラケットで囲われてんのやろ。あ、そっか配列の初期化でいつも「list = [1, 2]」とかやってるもんね。それと同じだ。NSMutableArray が何度も出てきてそれに惑わされてしまった。

NSMutableArray *hogeArray = [NSMutableArray array];

配列にはどんなオブジェクトも格納できるらしいけど、int を入れようとしたら出来なかった。addObject ではダメってことかしら。ハマっている人が多いらしく、日本語で検索するとすぐに引っ掛った(英語だと StackOverflow ばかり引っ掛かる)。

NSMutableArray *hogeArray = [NSMutableArray array];

NSString *mami = @"mamimami";
NSString *tiro = @"finale";
int fuga = 5;

[hogeArray addObject:mami];
[hogeArray addObject:tiro];
[hogeArray addObject:[NSNumber numberWithInt:fuga]];

NSString *element = [hogeArray objectAtIndex:1];
NSLog(@"%@", element);

というように、[NSNumber numberWithInt:xxx] を使って変換(というかオブジェクト化)してやるのだとか。hogeArray の部分を while か何かで回してやれば辞書が作れそう。

リファレンスの見方

addObject:

 - (void)addObject:(id)anObject
 Adds anObject to the receiver if it isn’t already a member. If anObject is already a member, addObject: increments the count associated with the object. In either case, anObject is then sent a retain message.

先頭が - のものはインスタンスメソッド。void なので返り値は無い(送りっぱなし)。セットする型は id(オブジェクト)なで、値はオブジェクト(anObject)でないといけない。ちなみに + はクラスメソッド

ということなので、昨日の [NSNumber numberWithInt:100] がやっていることは、100 という値を持つ NSNumber オブジェクトを作成しているということになる。オブジェクトの名前を付けなくても使えるんだね。

numberWithInt:

 + (NSNumber *)numberWithInt:(int)value
 Creates and returns an NSNumber containing value, treating it as a signed int.

(NSNumber *) の意味って何だろう?アスタリスクが付くってことは番地を返すってことなの?

ドット構文も使えるそうな。下記はどちらも同じ意味になるとのこと。

[foo setValue:100];
foo.value = 100;

やっぱりドットを使った方がわかりやすいなぁ。単に慣れていないだけという話もある。日曜プログラマはどっちを使っているのだろう?ソースが公開されているプロジェクトを見たことがない。

C# のソースもそうなのだけど、IDE で作成したものって公開するのにどのファイルが必要なのかわからない。Visual Studio は Form.cs だけではビルドできないし、Xcode は main.m だけではビルドできないし。

プロパティ関係もろもろが必要となると、プロジェクトディレクトリ以下全てが必要になってしまう。そうすると username とか個人的なディレクトリ構成とかがバレちゃうよね?だから Win 系や Mac 系でソースを公開している人が少ないのかな。単に自分が知らないだけとも言えるけど。