@による省略
interfaceとかの@マークの話ではなく,@"文字列"などのアットマークの話です.
この@は普段無意識に使っているかもしれませんが,これは@の直後にある型を自動で判断してプリミティブ型からオブジェクトを生成する省略記号である.つまり以下のことが言える.
@1; // => [NSNumber numberWithInteger:1] @0.5; // => [NSNumber numberWithDouble:0.5]], @YES; // => [NSNumber numberWithBool:YES]], @"文字列" // => キャスト(よくわからなかったので省略) @[@1]; // => [NSArray arrayWithObjects:{@1} count:1]; @{@"hoge": @"fuga"}; // [NSDictionary dictionaryWithObjects:{@"fuga"} forKeys:{@"hoge"} count:1]
@の後ろの型が明確であれば@を用いて省略ができる
int i = 0; NSNumber num = @(i);
このように簡単にプリミティブ型をオブジェクトに変換できる.ちなみに既存のコードを書き換えたい場合, Edit -> Refactor -> Convert to Modern Objective-C Syntax... を使えば直ちに省略した形に書き換えてくれる.
.(ドット)アクセス
特定の形式のメッセージは,ドットアクセスが可能である.ドットアクセスにはgetterとsetterがある.一つのメッセージで両方の役割をはたすことはできない.
- getter
引数を持たない.
- setter
メッセージ名が"set + 大文字 + 任意の文字列"をである
一つの引数をもつ
このとき,戻り値は問わない.ただし,getterの戻り値がvoidの場合警告が出し,setterの戻り値がvoidでない場合戻り値は捨てられてしまう.@propertyで宣言されたメンバ変数は自動的にgetterとsetterが生成される.
セッターに関してドットアクセスする場合いくつか中止すべき点がある.
- 構造体を返すgetterが途中には挟まった場合コンパイルエラーとなる
view.frame.size.height = 1; // コンパイルエラー
これはframeが返している値はオブジェクトのポインタではなく,構造体のコピーが帰ってきているためである.もし,コンパイルエラーにならなくても正しく設定されない.
- 本来使われるべきmethodを隠してしまう
button.title = @"ほげほげ" // 正しくは [button setTitle:@"ほげほげ" forState:UIControlStateNormal];
まとめ
Objective-Cの角括弧だらけのプログラムはダサいと思う