4

以下のコードはどういう意味ですか?

#define kSelectedTabDefaultsKey @"Selected Tab"

 enum {
    kByName,
    kBySecretIdentity,
    };

#define kSelectedTabDefaultsKey @"Selected Tab" は、値が "SelectedTab" である "kSelectedTableTabKey" という定数を定義していることを意味しますか? NSDictionary の 1 つのキーと値のペアのようなものですか?

enum は kByName 値 = 0 および kBySecretIdentity 値 = 1 を変換するだけだと思います。#define kSelectedTabDefaultsKey と enum は結び付いていますか?

コードの後半で次のようになるため、正しく理解できていないと思います。

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

NSInteger selectedTab = [defaults integerForKey:kSelectedTabDefaultsKey];
// How does "selectedTab" get back an integer?  I thought "kSelectedTabDefaultsKey"
// was a  key with a String value of @"Selected Tab ?

UITabBarItem *item = [self.tabBar.items objectAtIndex:selectedTab];
4

4 に答える 4

5
#define kSelectedTabDefaultsKey @"Selected Tab"

これは単に、コンパイラが参照するすべての場所を にkSelectedTabDefaultsKey展開する必要があることをコンパイラに通知するだけ@"Selected Tab"です。

したがって、この:

NSInteger selectedTab = [defaults integerForKey:kSelectedTabDefaultsKey];

これになります:

NSInteger selectedTab = [defaults integerForKey:@"Selected Tab"];

selectedTabintegerForKey:デフォルトマネージャが@"Selected Tab"デフォルトデータベースでキーを検索した後、によって返される値は何でも終了します。おそらく、列挙型の 2 つの値に対応する 0 または 1 になります。


enum は defaults キーとは関係ありませんが、便利です。

 enum {
    kByName,
    kBySecretIdentity,
    };

これにより、kByName が検出されるたびに 0 を代入し、kBySecretIdentity を 1 に代入するようコンパイラーに指示します。それ以上でもそれ以下でもありません。

したがって、おそらく、データベースに書き込まれる値は 0 または 1 のいずれかになります。列挙型が存在するため、コードでは、わかりやすくするために 0 の代わりに「kByName」と言うことができます。投稿したコードでは、デフォルトデータベースからの値が単にタブを選択するために渡されるため、どちらの列挙型も直接言及されていません。

デフォルト データベースの結果を確認することをお勧めします。列挙型を次のように再定義します。

 enum {
    kByName,
    kBySecretIdentity,
    kByUnusedSentinal
    };

それで:

NSInteger selectedTab = [defaults integerForKey:kSelectedTabDefaultsKey];
if ((selectedTab < 0) || (selectedTab >= kByUnusedSentinal))
    selectedTab = kByName;

そうすれば、bogon がデフォルト データベースに書き込まれると、アプリはデフォルトで kByName タブになります。

于 2013-03-27T16:34:09.523 に答える
2

#define kSelectedTabDefaultsKey @"Selected Tab"kSelectedTabDefaultsKey にREPLACEMENT TEXT @"Selected Tab"("Selected Tab"またはではない) を定義していることを意味します。Selected Tab

代わりにそれを定義することができif (x==、定義された名前を使用する場所はどこでも(意味があるかどうかにかかわらず)そのテキストに置き換えられます。その「値」は (いくつかの紛らわしい例外を除いて)正確には、空白以外の最初の文字で始まり、行末 (空白がない) で終わるテキストです。

(代わりにbegin/を使用する言語では、#defining "begin" によって実際のいたずらを作成できます。)end{/}

于 2013-03-27T16:39:33.570 に答える
1

#define は、コンパイラが実行される前に、プリプロセッサによってソース コードで実行されるテキスト置換と考えてください。上記の @bbum の例は、これを示しています。

列挙型は、コンパイラによって理解される新しい型の並べ替えです。基本的にシンボルを整数 (つまり定数) にマップしますが、#define を使用した場合よりも強力な型チェックを行います。

于 2013-03-27T16:38:00.660 に答える
0

define は const に似ています (ただし、コンパイラではなくプリコンパイラによって処理されます)。

kSelectedTabDefaultsKey は、選択されたタブが保存されるデフォルト設定の (文字列) 名前です。設定が読み取られた後、以前に選択されていたタブがタブ バーで再度選択されます。おそらくこれはアプリの再起動時に行われます。

列挙型は関連していないようです。

于 2013-03-27T16:33:55.647 に答える