文面量-文法飴
5380 ワード
Objective-Cプログラムを作成する時、いつもある種類を使って、それらはFoundationフレームに属します.技術的にはFoundationフレームを使わずにObjective-Cコードを書くことができますが、実際にはこのフレームをよく使います.
これらはNSString、NSNumber、NSAray、NSDictoraryです.クラス名からそれぞれが示すデータ構造が分かる.
Objective-Cは文法が煩雑で有名です.事実は確かにそうです.しかし、Objective-C 1.0からは、NSStringオブジェクトを作成することができる非常に簡単な方法があります.
これは「文字列の文字列量」で、その文法は以下の通りです.NSString*someString=@"Effective Objective-C 2.0"
このような文法を使わないと、NSStringオブジェクトを一般的なallocおよびinit方法で割り当てて初期化します.
比較的新しいバージョンのコンパイラでは、NSNumber、NSArry、NSDictionary類の例をこのような字面量文法で宣言することもできる.
文面量文法を使ってソースコードの長さを短縮し、読みやすくします.
文字数
整数、浮動小数、ブール値をObjective-Cオブジェクトに封入する必要があります.この場合にはNSNumber類を用いることができ、このクラスは複数の種類の数値を扱うことができる.字面量を使わない場合は、以下のように例を作成する必要があります.
NSNumber*someNumber=[NSNumber number WithInt:1]
上の行のコードは数値を作成し、その値を整数1に設定します.しかし、文字どおりの量を使うとコードがより清潔になります.
NSNumber*someNumber=@1;
字面の量や文法の簡素化が見られます.でも、まだいいところがたくさんあります.NSNumberの例で表すことができるすべてのデータタイプは、このシンタックスを使用することができる.たとえば:
NSNumber intNumber=@1
NSNumber float [email protected] f
NSNumber doub [email protected];
NSNumber book Number=@YES;
NSNumber*charNumber=@'a'
文面量文法は下記の表現にも適用されます.
int x=5
float y=6.32 f
NSNumber*expressitionNumber=@(x*)
文字の量で数値を表すのはとても役に立ちます.これはNSNumberオブジェクトを綺麗にすることができます.ステートメントには数値だけが含まれていますので、余分な文法成分はありません.
文字列数配列
配列は、一般的なデータ構造です.文面量文法を使わない場合は、このように配列を作成します.
NSAray*アニマル=
NSAray*animls=@@「cat」、@「dog」、@「mouse」、@「badger」
上のようなやり方は簡単なだけでなく、配列の操作にも有利です.配列の一般的な操作は、ある下標に対応する対象をとることです.これは字面量で行うのがより簡単です.字面量を使わないなら、普通は「object AtIndex:」という方法を使います.
NSString*dog=[animls object AtIndex:1]
文字の量を使うと、
NSString*dog=アニマル[1];
これは「下付き」とも呼ばれ、字面量文法を使う他の場合と同様に、より簡潔で分かりやすく、他の言語の下付き文字で配列要素にアクセスする際に使う文法と似ています.
ただし、字面量文法で配列を作成する時は、配列要素の対象にnilがあると異常を投げます.字面量文法は実際には「構文糖」(syntactic sugar)にすぎないので、その効果は最初に配列を作成し、四角い括弧内のすべての対象をこの配列に加えます.投げた異常はこうなります.
**Terminating ap due to uncaugt exception
'NSInvalidAgMent Exception'
-[color=0066 a 7]NSPlace HolderAray init WithObject:count:]:atempt to
insert nil object from object[0]
字面量の文法を使って配列を作る時この問題に出会います.次のコードは2つの構文で配列を作成します.
id object 1=/*/;
id object 2=/*/;
id object 3=/*/;
NSAray*arrayA=[NSAray array WithObject]
みんなは考えてみます.もしobject 1とobject 3が有効なObjective-Cの対象を指していますが、object 2がnilだったら、どのような状況がありますか?字面量の文法で配列arrayBを作成すると異常が発生します.
arrayAは作成できますが、その中にはObject 1つのオブジェクトしか含まれていません.理由は、「arrayWithObject:」方法は各パラメータを順次処理しています.nilが発見されるまで、object 2はnilであるため、この方法は早期に終了します.
この微妙な違いは、文面量文法を使うほうが安全であることを示しています.例外を投げてアプリケーションを実行終了させます.これは配列を作成してから元素の個数が少ないことを発見するより良いです.
配列にnilを挿入すると、プログラムが間違っていることがよく分かりますが、異常によってこのエラーが早く発見されます.
字面辞典
「辞書」はマッピング型のデータ構造で、キーパッドのペアを追加することができます.配列と同じように、Objective-Cコードも辞書でよく使われます.その作成方法は以下の通りです.
NSDictionary*personData=
NSDictionary*personData=
字面量文法を使うと簡単にできるので、数字の前に@文字を加えるだけでいいです.
配列と同じように字面量文法で辞書を作る時にも問題があります.それは一度nilという値があると異常を投げかけることです.でも同じ原因に基づいて、これもいいことです.
辞書を作る時に、空の値の対象を使ってしまったら、「dictary WithObjects AndKeys:」という方法は最初のnilの前で止まって、異常を投げてしまいます.これは間違いを調べるのに役立ちます.
辞書は配列のように字面量文法でもアクセスできます.
NSString*lastName=[persont Data object ForKey];
同等の字面量文法は以下の通りです.
NSString*lastName=persodata[@"lastName"]
このように書くのも面倒な文法を省いて、この行のコードを簡単に読みやすくします.
可変配列と辞書
ラベルを外すことで、配列の中のある下付きまたは辞書の中のあるキーに対応する要素にアクセスできます.配列と辞書のオブジェクトが可変であれば、下付きで要素値を変更することもできます.可変配列と辞書の内容を変更する標準的な方法は以下のとおりです.
[mutble Arary replace Object AtIndex:1 withObject:@"dog"
[muttible Dictionary setObject:@"Galloway"forKey:@"lastName";
ラベルを外す操作で書き換えると、次のようになります.
mutable Aray[1]=@"dog"
mutable Dictionary[@"lastName"=@"Galloway";
限界性
字面量文法には小さな制限があります.文字列以外に作成されたオブジェクトはFoundationフレームに属していなければなりません.これらの種類のサブクラスをカスタマイズしたら、字面量文法でそのオブジェクトを作成することができません.
自定義子類を作成するには、「非字面量文法」が必要です.
しかし、NSAray、NSDictionary、NSNumberはすでに定型化されている「子族」であるため、義子類を自決する人は少なく、本当にそのようにするのも面倒です.
また、一般的には、標準の実装は十分です.変更する必要はありません.文字列を作成するときはカスタムのサブクラスが使用できますが、コンパイラのオプションを変更しなければなりません.このような結果がわかっていない限り、このオプションを使用することを奨励しないでください.NSStringで十分です.
字面量文法を使って作成された文字列、配列、辞書オブジェクトは可変ではありません.可変バージョンのオブジェクトが欲しいなら、コピーします.
NSMutable Aray*mutable=@@[1,@2,@3,@4,@5]mutable Copy;
このようにすると、一つの方法を呼び出して、もう一つのオブジェクトを作成しますが、字面量文法を使うと、上記の欠点よりメリットが多いです.
要点
文字列、数値、配列、辞書を作成するには、字面量文法を使用します.このようなオブジェクトを作成する従来の方法に比べて、より分かりやすくなります.
ラベルを外すことによって、配列の下付きまたは辞書の中のキーに対応する要素にアクセスするべきです.
字面量文法で配列や辞書を作成する場合、値にnilがあると異常を投げます.そのため、必ずnilは含まれていません.
これらはNSString、NSNumber、NSAray、NSDictoraryです.クラス名からそれぞれが示すデータ構造が分かる.
Objective-Cは文法が煩雑で有名です.事実は確かにそうです.しかし、Objective-C 1.0からは、NSStringオブジェクトを作成することができる非常に簡単な方法があります.
これは「文字列の文字列量」で、その文法は以下の通りです.NSString*someString=@"Effective Objective-C 2.0"
このような文法を使わないと、NSStringオブジェクトを一般的なallocおよびinit方法で割り当てて初期化します.
比較的新しいバージョンのコンパイラでは、NSNumber、NSArry、NSDictionary類の例をこのような字面量文法で宣言することもできる.
文面量文法を使ってソースコードの長さを短縮し、読みやすくします.
文字数
整数、浮動小数、ブール値をObjective-Cオブジェクトに封入する必要があります.この場合にはNSNumber類を用いることができ、このクラスは複数の種類の数値を扱うことができる.字面量を使わない場合は、以下のように例を作成する必要があります.
NSNumber*someNumber=[NSNumber number WithInt:1]
上の行のコードは数値を作成し、その値を整数1に設定します.しかし、文字どおりの量を使うとコードがより清潔になります.
NSNumber*someNumber=@1;
字面の量や文法の簡素化が見られます.でも、まだいいところがたくさんあります.NSNumberの例で表すことができるすべてのデータタイプは、このシンタックスを使用することができる.たとえば:
NSNumber intNumber=@1
NSNumber float [email protected] f
NSNumber doub [email protected];
NSNumber book Number=@YES;
NSNumber*charNumber=@'a'
文面量文法は下記の表現にも適用されます.
int x=5
float y=6.32 f
NSNumber*expressitionNumber=@(x*)
文字の量で数値を表すのはとても役に立ちます.これはNSNumberオブジェクトを綺麗にすることができます.ステートメントには数値だけが含まれていますので、余分な文法成分はありません.
文字列数配列
配列は、一般的なデータ構造です.文面量文法を使わない場合は、このように配列を作成します.
NSAray*アニマル=
[NSArray arrayWithObjects:@"cat", @"dog",
@"mouse", @"badger", nil];
文面量文法を使って作成します.NSAray*animls=@@「cat」、@「dog」、@「mouse」、@「badger」
上のようなやり方は簡単なだけでなく、配列の操作にも有利です.配列の一般的な操作は、ある下標に対応する対象をとることです.これは字面量で行うのがより簡単です.字面量を使わないなら、普通は「object AtIndex:」という方法を使います.
NSString*dog=[animls object AtIndex:1]
文字の量を使うと、
NSString*dog=アニマル[1];
これは「下付き」とも呼ばれ、字面量文法を使う他の場合と同様に、より簡潔で分かりやすく、他の言語の下付き文字で配列要素にアクセスする際に使う文法と似ています.
ただし、字面量文法で配列を作成する時は、配列要素の対象にnilがあると異常を投げます.字面量文法は実際には「構文糖」(syntactic sugar)にすぎないので、その効果は最初に配列を作成し、四角い括弧内のすべての対象をこの配列に加えます.投げた異常はこうなります.
**Terminating ap due to uncaugt exception
'NSInvalidAgMent Exception'
-[color=0066 a 7]NSPlace HolderAray init WithObject:count:]:atempt to
insert nil object from object[0]
字面量の文法を使って配列を作る時この問題に出会います.次のコードは2つの構文で配列を作成します.
id object 1=/*/;
id object 2=/*/;
id object 3=/*/;
NSAray*arrayA=[NSAray array WithObject]
object1, object2, object3, nil];
NSAray*arrayB=@[object 1,object 2,object 3]みんなは考えてみます.もしobject 1とobject 3が有効なObjective-Cの対象を指していますが、object 2がnilだったら、どのような状況がありますか?字面量の文法で配列arrayBを作成すると異常が発生します.
arrayAは作成できますが、その中にはObject 1つのオブジェクトしか含まれていません.理由は、「arrayWithObject:」方法は各パラメータを順次処理しています.nilが発見されるまで、object 2はnilであるため、この方法は早期に終了します.
この微妙な違いは、文面量文法を使うほうが安全であることを示しています.例外を投げてアプリケーションを実行終了させます.これは配列を作成してから元素の個数が少ないことを発見するより良いです.
配列にnilを挿入すると、プログラムが間違っていることがよく分かりますが、異常によってこのエラーが早く発見されます.
字面辞典
「辞書」はマッピング型のデータ構造で、キーパッドのペアを追加することができます.配列と同じように、Objective-Cコードも辞書でよく使われます.その作成方法は以下の通りです.
NSDictionary*personData=
[NSDictionarydictionaryWithObjectsAndKeys:
@"Matt", @"firstName",
@"Galloway", @"lastName",
[NSNumber numberWithInt:28], @"age",
nil];
このように書くのは困ります.その順序は、、、です.これは通常の理解の順序とは逆で、「キー」を「対象」に写すと考えられています.そのため、このような書き方は読みにくいです.字面の文法を使うと、分かりやすくなります.NSDictionary*personData=
@{@"firstName" : @"Matt",
@"lastName" : @"Galloway",
@"age" : @28};
上記のような表記はより簡明で、かつキーがオブジェクトの前に現れているので、スムーズに理解できます.この例コードは字面量の数値を使う利点を説明しています.辞書のオブジェクトとキーはすべてObjective-Cオブジェクトである必要があります.したがって、整数28を直接に入れることはできません.NSNumberの例にカプセル化しなければなりません.字面量文法を使うと簡単にできるので、数字の前に@文字を加えるだけでいいです.
配列と同じように字面量文法で辞書を作る時にも問題があります.それは一度nilという値があると異常を投げかけることです.でも同じ原因に基づいて、これもいいことです.
辞書を作る時に、空の値の対象を使ってしまったら、「dictary WithObjects AndKeys:」という方法は最初のnilの前で止まって、異常を投げてしまいます.これは間違いを調べるのに役立ちます.
辞書は配列のように字面量文法でもアクセスできます.
NSString*lastName=[persont Data object ForKey];
同等の字面量文法は以下の通りです.
NSString*lastName=persodata[@"lastName"]
このように書くのも面倒な文法を省いて、この行のコードを簡単に読みやすくします.
可変配列と辞書
ラベルを外すことで、配列の中のある下付きまたは辞書の中のあるキーに対応する要素にアクセスできます.配列と辞書のオブジェクトが可変であれば、下付きで要素値を変更することもできます.可変配列と辞書の内容を変更する標準的な方法は以下のとおりです.
[mutble Arary replace Object AtIndex:1 withObject:@"dog"
[muttible Dictionary setObject:@"Galloway"forKey:@"lastName";
ラベルを外す操作で書き換えると、次のようになります.
mutable Aray[1]=@"dog"
mutable Dictionary[@"lastName"=@"Galloway";
限界性
字面量文法には小さな制限があります.文字列以外に作成されたオブジェクトはFoundationフレームに属していなければなりません.これらの種類のサブクラスをカスタマイズしたら、字面量文法でそのオブジェクトを作成することができません.
自定義子類を作成するには、「非字面量文法」が必要です.
しかし、NSAray、NSDictionary、NSNumberはすでに定型化されている「子族」であるため、義子類を自決する人は少なく、本当にそのようにするのも面倒です.
また、一般的には、標準の実装は十分です.変更する必要はありません.文字列を作成するときはカスタムのサブクラスが使用できますが、コンパイラのオプションを変更しなければなりません.このような結果がわかっていない限り、このオプションを使用することを奨励しないでください.NSStringで十分です.
字面量文法を使って作成された文字列、配列、辞書オブジェクトは可変ではありません.可変バージョンのオブジェクトが欲しいなら、コピーします.
NSMutable Aray*mutable=@@[1,@2,@3,@4,@5]mutable Copy;
このようにすると、一つの方法を呼び出して、もう一つのオブジェクトを作成しますが、字面量文法を使うと、上記の欠点よりメリットが多いです.
要点
文字列、数値、配列、辞書を作成するには、字面量文法を使用します.このようなオブジェクトを作成する従来の方法に比べて、より分かりやすくなります.
ラベルを外すことによって、配列の下付きまたは辞書の中のキーに対応する要素にアクセスするべきです.
字面量文法で配列や辞書を作成する場合、値にnilがあると異常を投げます.そのため、必ずnilは含まれていません.