Do not lift a finger

ローマの休日のために朝方まで起きてしまった。朝日を感じながら寝る。

そして起きたのが19:30頃。せっかくの3連休、なにもできないぞこりゃ。

オブジェクト指向プログラミング入門 第2版 Timothy A. Budd、「第3章クラスとメソッド」と「第4章メッセージとインスタンスと初期化の例題をXcodeでビルドしてみる。

プロジェクトは「ファイルメニュー>新規プロジェクト>Command Line Utility>Standard Tool」としてプロジェクトのmain.cをmain.mに変更。
「プロジェクト>プロジェクト設定を編集」で「"プロジェクト"Card""の情報」を開き、「ビルド」タブ、「すべての構成」、「すべての設定」、「リンク」、「他のリンカフラグ」に「-lobjc」を設定しておく。

まず、@interfaceの

   -(void) drawAt:(int) and:(int); //error: syntax error before ';' token

宣言がエラーになる。
どうやら仮引数を指定しないといけないようだ。次のように変更。

    -(void) drawAt:(int)x and:(int)y;

「4.3.3 Objective-C における創出初期化」のp108では、

なお工場メソッドにおいてインスタンス変数が使われても、
Objective-Cコンパイラは警告メッセージをだしません。

とあったがどうやらGCC4では警告が出る様子。
なのでメソッドを呼び出して初期化することにした。

+suit:(int)s rank:(int)r
{
    self = [Card new];
    //suit = s; // warning: instance variable 'suit' accessed in class method
    //rank = r; // warning: instance variable 'rank' accessed in class method
    [self suit:s rank:r];
    return self;
}

main関数は仮に次のようにしてみた。

const char *SuitString[] = { "Heart", "Club", "Diamond", "Spade" };
const char *ColorString[] = { "Red", "Black" };
const char *FaceUpString[] = { "NO", "YES" };

int main(int argc, char *argv[])
{
    id aCard = [Card suit:Heart rank:1];
    id newCard = [aCard copy];
    [aCard flip];
    printf("suit %s, color %s, rank %d, faceUp %s\n",
               SuitString[[aCard suit]],
               ColorString[[aCard color]],
               [aCard rank],
               FaceUpString[[aCard faceUp]]);
      // --> suit Heart, color red, rank 1, faceUp YES
    [aCard free];
    [newCard free];
    return 0;
}