4

下面的代码是什么意思?

#define kSelectedTabDefaultsKey @"Selected Tab"

 enum {
    kByName,
    kBySecretIdentity,
    };

#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];
4

4 回答 4

5
#define kSelectedTabDefaultsKey @"Selected Tab"

这只是告诉编译器它看到的任何地方都kSelectedTabDefaultsKey应该将其扩展为@"Selected Tab".

所以这:

NSInteger selectedTab = [defaults integerForKey:kSelectedTabDefaultsKey];

变成这样:

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

selectedTab在默认值管理器在默认值数据库中integerForKey:查找键之后,将返回任何值。@"Selected Tab"据推测,它将是 0 或 1 对应于您的枚举中的两个值。


枚举与默认键无关,但很方便。

 enum {
    kByName,
    kBySecretIdentity,
    };

这告诉编译器在遇到 kByName 时用 0 替换,并用 1 替换 kBySecretIdentity。不多也不少。

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

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

 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 定义替换文本@"Selected Tab"(不是"Selected Tab"Selected Tab)。

您可以将其定义为if (x==,并且无论您使用定义的名称(无论是否有意义),它都会替换该文本。它的“值”是(有一些令人困惑的例外)正是以第一个非空白字符开头并以行尾结束的文本(没有空格)。

(在使用begin/end而不是你的语言中,{/}你可以通过#defining "begin" 来制造一些真正的恶作剧。)

于 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 回答