コードを効率的に記述する方法(二):定数の定義
2977 ワード
簡潔な文法
正式に定量定義を紹介する前に、Objective-Cのいくつかの文法糖を紹介して、完全に定量定義とは関係なく、知っていることはスキップすることができます.一般的に、NSString、NSArray、NSDictionaryを定義すると、次のように書かれます.
以上がOCのこの3つのクラスに対する簡潔な文法であり,配列のアクセスを含め,辞書の方位は角括弧形式を用いることができ,これ以上は言わない.注意すべき点は、このようなメリットがどこにあるかを知ることです.どうしてこう書くの?1、簡潔で、可読性が高い.2、安全性が高い.たとえば、NSArrayの作成など、簡潔な構文を使用しない場合は、通常、次のように書きます.
これにより、3つのオブジェクトを含む配列が作成されますが、bObjがnilの場合、bArrayには1つの要素aObjしか含まれていません.このように配列を作成すると、空のオブジェクト(nil)に遭遇したときに後の要素の取得が終了します.自分の配列要素が制御できないことを望んでいますか?それとも、隠れた危険があるときに明らかな間違いを報告したいですか?後者を希望する場合は、簡潔な文法を使用することをお勧めします.これによりbObjが空の場合,コンパイル中にエラーが報告される.これは辞書についても同じです.
正題:定数の定義
通常、メンテナンス性を向上させたり、読みやすくしたりするために、定数を導入します.通常、定数の方法は2つあります.1つは#defineを使用してマクロを前処理し、2つ目はstatic constを使用します.
2つの質問があります.では、いったいどの方法が適していますか.定数はどう書きますか.
問題1
通常、static const定義の方法は#defineよりも優れています.たとえば、アニメーション時間を定義するときに#define ANIMATION_を使用します.DURATION 0.3 fのような前処理コマンドですが、1、タイプ情報が失われている2、ヘッダファイルに#defineがあると重名になりやすく、さらに「定数」が変更されることになります.例えば、私はViewController Aでdefine DURATION 0.3 f、ViewController Bでdefine DURATION 0.5 f、VIewController BでViewController Aを再設定します.h、このときコンパイラはDURATION redifinedと警告しますが、実際にDURATIONは変更されています.
そこで、以下の方法をお勧めします.
これにより、定数のタイプを明確にするも、上記のような役割ドメインはクラスにのみ存在するため、名前を変更する問題は生じない.h和.mの下で、修正するとコンパイル中のエラーが発生します.
問題2
まず位置の問題で、基本的なすべての定数(グローバルを除く)は、私たちは書くべきです.mファイルにあります.第一に、名前の変更を防止するために、static constキーワードが追加する定数であっても、書くことができない.h中.第二に、グローバル変数を除いて、私たちの定数は.hに存在するのはほとんど何の役にも立たない.パッケージを考えると、私たちは書くべきです.mファイルにあります.
名前の問題:
定数の前に小文字「k」を追加すると、コードの可読性が向上します.ヘッダファイルに書いて外部に露出する必要がある場合は、通常、定数名にクラス名の接頭辞を追加する必要があります.
staticとconst
声明の時、この2つの欠けているものは1つではありません.constは後ろのものが固定されていて、修正できない(ポインタを含む)ことを示しています.宣言するときはconstを変数名の前に置く必要があります.たとえば、
staticは静的を表し、定義された役割ドメインでのみ使用できることを意味し、クラスで宣言すると、このクラスはすべて使用でき、メソッドの内部で定義され、メソッドの内部でのみ使用できます.staticがなく、他の役割ドメインでも同じ名前定数が定義されている場合、コンパイラはエラーを報告します.linkerクラスのエラー、XCodeのエラーは明らかではありません.注意してください.
グローバル変数
通知名などのグローバル変数を定義する必要がある場合があります.登録されたすべての通知のクラスでは、通知定数名だけを知りたいのですが、定数の具体的な内容には本当に関心がありません.声明は以下の通りである:h中:
はい.m:
externキーワードの役割は、FHKeyboardNotification文字列定数が存在することをコンパイラに伝え、その具体的な値に関心を持つ必要はありません.定数は一度だけ宣言されるべきで、コンパイラはFHKeyboardNotificationに遭遇して正しい処理を行います.
まとめ
1.タイプ情報が含まれていない場合があり、変更されやすいため、#define前処理コマンドを使用して定数を定義することはできるだけ避ける.2、なるべくmに定数を書く.3、グローバル変数の命名に注意し、クラス名の接頭辞を追加する必要があります.
正式に定量定義を紹介する前に、Objective-Cのいくつかの文法糖を紹介して、完全に定量定義とは関係なく、知っていることはスキップすることができます.一般的に、NSString、NSArray、NSDictionaryを定義すると、次のように書かれます.
NSString *aStr = @"AAAAA";
NSArray *array = @[@"a",@"b",@"c"];
NSDictionary *dic = @{
@"a":@"A",
@"b":@"B",
@"c":@"c"
};
以上がOCのこの3つのクラスに対する簡潔な文法であり,配列のアクセスを含め,辞書の方位は角括弧形式を用いることができ,これ以上は言わない.注意すべき点は、このようなメリットがどこにあるかを知ることです.どうしてこう書くの?1、簡潔で、可読性が高い.2、安全性が高い.たとえば、NSArrayの作成など、簡潔な構文を使用しない場合は、通常、次のように書きます.
NSArray *bArray = [NSArray arrayWithObjects:aObj,bObj,cObj, nil];
これにより、3つのオブジェクトを含む配列が作成されますが、bObjがnilの場合、bArrayには1つの要素aObjしか含まれていません.このように配列を作成すると、空のオブジェクト(nil)に遭遇したときに後の要素の取得が終了します.自分の配列要素が制御できないことを望んでいますか?それとも、隠れた危険があるときに明らかな間違いを報告したいですか?後者を希望する場合は、簡潔な文法を使用することをお勧めします.これによりbObjが空の場合,コンパイル中にエラーが報告される.これは辞書についても同じです.
正題:定数の定義
通常、メンテナンス性を向上させたり、読みやすくしたりするために、定数を導入します.通常、定数の方法は2つあります.1つは#defineを使用してマクロを前処理し、2つ目はstatic constを使用します.
2つの質問があります.では、いったいどの方法が適していますか.定数はどう書きますか.
問題1
通常、static const定義の方法は#defineよりも優れています.たとえば、アニメーション時間を定義するときに#define ANIMATION_を使用します.DURATION 0.3 fのような前処理コマンドですが、1、タイプ情報が失われている2、ヘッダファイルに#defineがあると重名になりやすく、さらに「定数」が変更されることになります.例えば、私はViewController Aでdefine DURATION 0.3 f、ViewController Bでdefine DURATION 0.5 f、VIewController BでViewController Aを再設定します.h、このときコンパイラはDURATION redifinedと警告しますが、実際にDURATIONは変更されています.
そこで、以下の方法をお勧めします.
static NSTimeInterval const kAnimationDuration = 0.3;
これにより、定数のタイプを明確にするも、上記のような役割ドメインはクラスにのみ存在するため、名前を変更する問題は生じない.h和.mの下で、修正するとコンパイル中のエラーが発生します.
問題2
まず位置の問題で、基本的なすべての定数(グローバルを除く)は、私たちは書くべきです.mファイルにあります.第一に、名前の変更を防止するために、static constキーワードが追加する定数であっても、書くことができない.h中.第二に、グローバル変数を除いて、私たちの定数は.hに存在するのはほとんど何の役にも立たない.パッケージを考えると、私たちは書くべきです.mファイルにあります.
名前の問題:
定数の前に小文字「k」を追加すると、コードの可読性が向上します.ヘッダファイルに書いて外部に露出する必要がある場合は、通常、定数名にクラス名の接頭辞を追加する必要があります.
staticとconst
声明の時、この2つの欠けているものは1つではありません.constは後ろのものが固定されていて、修正できない(ポインタを含む)ことを示しています.宣言するときはconstを変数名の前に置く必要があります.たとえば、
static NSSting *const aStr = @"someString";
staticは静的を表し、定義された役割ドメインでのみ使用できることを意味し、クラスで宣言すると、このクラスはすべて使用でき、メソッドの内部で定義され、メソッドの内部でのみ使用できます.staticがなく、他の役割ドメインでも同じ名前定数が定義されている場合、コンパイラはエラーを報告します.linkerクラスのエラー、XCodeのエラーは明らかではありません.注意してください.
グローバル変数
通知名などのグローバル変数を定義する必要がある場合があります.登録されたすべての通知のクラスでは、通知定数名だけを知りたいのですが、定数の具体的な内容には本当に関心がありません.声明は以下の通りである:h中:
extern NSString *const FHKeyboardNotification;
はい.m:
NSString *const FHKeyboardNotification = @"keyboardDidChange";
externキーワードの役割は、FHKeyboardNotification文字列定数が存在することをコンパイラに伝え、その具体的な値に関心を持つ必要はありません.定数は一度だけ宣言されるべきで、コンパイラはFHKeyboardNotificationに遭遇して正しい処理を行います.
まとめ
1.タイプ情報が含まれていない場合があり、変更されやすいため、#define前処理コマンドを使用して定数を定義することはできるだけ避ける.2、なるべくmに定数を書く.3、グローバル変数の命名に注意し、クラス名の接頭辞を追加する必要があります.