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

时间:2013-03-27 16:27:59

标签: ios objective-c xcode

下面的代码是什么意思?

#define kSelectedTabDefaultsKey @"Selected Tab"

 enum {
    kByName,
    kBySecretIdentity,
    };

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

我认为enum只是翻译了kByName value = 0和kBySecretIdentity value = 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 个答案:

答案 0 :(得分: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,而对于kBySecretIdentity则替换为1。不多也不少。

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

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

 enum {
    kByName,
    kBySecretIdentity,
    kByUnusedSentinal
    };

然后:

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

这样,如果一个bogon被写入默认数据库,你的应用程序将默认为kByName选项卡。

答案 1 :(得分:2)

#define kSelectedTabDefaultsKey @"Selected Tab"表示您为kSelectedTabDefaultsKey定义了REPLACEMENT TEXT @"Selected Tab"(不是"Selected Tab"Selected Tab)。

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

(在使用begin / end代替{/}的语言中,您可以通过#defining“begin”创建一些真正的恶作剧。)

答案 2 :(得分:1)

将#define视为编译器运行之前预处理器在源代码中执行的文本替换。上面的例子来自@bbum说明了这一点。

枚举是编译器理解的新类型。它实际上将一个符号映射到一个整数(即一个常数),但是使用比使用#define更强的类型检查。

答案 3 :(得分:0)

define就像一个const(但由预编译器而不是编译器处理)。

kSelectedTabDefaultsKey是存储所选选项卡的默认首选项的(字符串)名称。 读取首选项后,在选项卡栏上再次选择先前选择的选项卡。可能这是在应用程序重启时完成的。

枚举似乎并不相关。