not good but great

プログラミング、アート、映画・本の感想について書きます。

Objective-Cにおけるクラスとインスタンスの書き方

クラスを使う

メッセージ式

一般的なプログラミング言語ではクラスのメソッドを使うときに「myObj.func()」というようにドットを使って書きます。しかしObjective-Cでは次のような書き方になります。

[オブジェクト メソッド名];
[myObj func];

このような書き方をメッセージ式と言います。

[オブジェクト メソッド名:引数];
[myObj func:a];

引数があるときは上のようになります

[オブジェクト メソッド名:引数1 ラベル2:引数2];
price = [myObj kingaku:250 kosu:3];

複数引数があるときは上のようになります。引数1のラベルはメソッド名になっていることに注意します。[myObj kingaku tanka:250 kosu:3]ではないことに気をつけましょう。

クラスメソッドとインスタンスメソッド

f:id:naoyashiga:20140413195728p:plain
クラスメソッドはクラスに対して実行するメソッド、インスタンスメソッドはインスタンスに対して実行するメソッドのことです。前者は頭に「+」を、後者は頭に「-」を付けます。

- (返り値のデータ型)メソッド名:(引数1のデータ型)引数1 ラベル2:(引数2のデータ型)引数2...
- (id)initWithTimeIntervalSinceNow:(NSTimeInterval)seconds
+ (id)dateWithTimeInterval:(NSTimeInterval)seconds sinceDate:(NSDate *)date

引数が二つだと上のようになります。データ型、ラベル名が混同しないようにしましょう。

NSTimeIntervalというデータ型

f:id:naoyashiga:20140413203144p:plain

typedef double NSTimeInterval

ヘルプを見るとNSTimeIntervalはdouble型と同じ意味を持つことがわかります。

インスタンスを使う

インスタンスの作成、初期化

NSDate *theDate = [NSDate alloc];//インスタンスを作る
theDate = [theDate init];//初期化する

NSObjectのallocメソッドを使ってインスタンスを生成します。次にインスタンスメソッドinitにより初期化します。

NSDate *theDate = [[NSDate alloc] init];
NSLog(@"the Date %@",theDate);//the Date 2014-04-13 11:20:16 +0000

一行で書くことも出来ます。

id型とは

返り値のid型は汎用型と呼ばれる何でもいける?データ型になります。

イニシャライザ

initではなく「initWithTimeIntervalSinceNow:」で初期化すると、現在時刻から指定した秒数後の時刻を取得することができます。

NSDate *theDate = [[NSDate alloc] initWithTimeIntervalSinceNow:30];
NSLog(@"the Date %@",theDate);//the Date 2014-04-13 11:34:47 +0000

initWithTimeIntervalSinceNow:のようにinitから始まり、インスタンスを初期化するメソッドを「イニシャライザ」と言います。

コンビニエンスコンストラク

dateのような初期化、allocといった一連の手順を簡略化したコンビニエンスコンストラクタを使うことも出来ます。

NSDate *theDate = [NSDate date];
NSLog(@"the Date %@",theDate);//the Date 2014-04-13 11:45:50 +0000

現在時刻を取得しました。初期化、allocの記述をする必要はないです。

NSDate *theTime = [NSDate dateWithTimeIntervalSinceNow:60*60];
NSLog(@"the Date %@",theTime);//the Date 2014-04-13 12:45:50 +0000

「initWithTimeIntervalSinceNow:」に対応するメソッドは「dateWithTimeIntervalSinceNow:」になります。引数の長さだけ経過した時刻を取得します。上のコードでは1時間後の時刻を取得しています。