简单的代码理解#define和枚举

use*_*173 4 xcode objective-c ios

下面的代码是什么意思?

#define kSelectedTabDefaultsKey @"Selected Tab"

 enum {
    kByName,
    kBySecretIdentity,
    };
Run Code Online (Sandbox Code Playgroud)

#define kSelectedTabDefaultsKey @"Selected Tab"是否意味着我们正在定义一个名为"kSelectedTableTabKey"的常量,其值为"SelectedTab"?有点像NSDictionary一个键/值对?

我想枚举只是将kByName值= 0和kBySecretIdentity值= 1是的#define kSelectedTabDefaultsKey和枚举绑在一起?

我不认为我理解正确,因为后面的代码:

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];
Run Code Online (Sandbox Code Playgroud)

bbu*_*bum 5

#define kSelectedTabDefaultsKey @"Selected Tab"
Run Code Online (Sandbox Code Playgroud)

这只是告诉编译器它看到的所有地方kSelectedTabDefaultsKey,它应该扩展到@"Selected Tab".

所以这:

NSInteger selectedTab = [defaults integerForKey:kSelectedTabDefaultsKey];
Run Code Online (Sandbox Code Playgroud)

变成这样:

NSInteger selectedTab = [defaults integerForKey:@"Selected Tab"];
Run Code Online (Sandbox Code Playgroud)

selectedTabintegerForKey:在默认管理器查找@"Selected Tab"默认数据库中的键之后,将以最终返回的值结束.据推测,它将是0或1,对应于枚举中的两个值.


枚举与默认密钥无关,但是方便.

 enum {
    kByName,
    kBySecretIdentity,
    };
Run Code Online (Sandbox Code Playgroud)

这告诉编译器在遇到kByName时替换0,而对于kBySecretIdentity则替换为1.不多也不少.

因此,据推测,写入到数据库中的值将是0或1枚举存在使得在代码中,你可以说"kByName"而不是0,为了清楚的一个.在您发布的代码中,没有直接提及枚举,因为默认数据库中的值只是传递给选择选项卡.

检查默认数据库的结果是明智的.重新定义枚举:

 enum {
    kByName,
    kBySecretIdentity,
    kByUnusedSentinal
    };
Run Code Online (Sandbox Code Playgroud)

然后:

NSInteger selectedTab = [defaults integerForKey:kSelectedTabDefaultsKey];
if ((selectedTab < 0) || (selectedTab >= kByUnusedSentinal))
    selectedTab = kByName;
Run Code Online (Sandbox Code Playgroud)

这样,如果将bogon写入默认数据库,则您的应用程序将默认为kByName选项卡.