【问题标题】:Simple code understanding of #define and enum#define和枚举的简单代码理解
【发布时间】:2013-03-27 16:27:58
【问题描述】:

下面的代码是什么意思?

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

【问题讨论】:

    标签: ios objective-c xcode


    【解决方案1】:
    #define kSelectedTabDefaultsKey @"Selected Tab"
    

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

    所以,这个:

    NSInteger selectedTab = [defaults integerForKey:kSelectedTabDefaultsKey];
    

    变成这样:

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

    selectedTab 将在默认管理器在默认数据库中查找键 @"Selected Tab" 后以 integerForKey: 返回的任何值结束。据推测,它将是 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 选项卡。

    【讨论】:

    • 好多了。谢谢! @"Selected Tab" 是默认数据库中的默认键吗?枚举呢?枚举与#define kSelectedTabDefaultsKey @"Selected Tab" 没有任何关系?还是这样?
    • 感谢您的详细解释。最后一个问题:NSUserDefaults standUserDefaults 是否有一个名为“Selected Tab”的现有键,其默认值为整数?我看不懂代码: NSInteger selectedTab = [defaults integerForKey:@"Selected Tab"];返回一个整数?
    • 没关系。找到答案: 返回值 与指定键关联的整数值。如果指定的key不存在,该方法返回0。
    【解决方案2】:

    #define kSelectedTabDefaultsKey @"Selected Tab" 表示您正在为 kSelectedTabDefaultsKey 定义替换文本 @"Selected Tab"(不是 "Selected Tab"Selected Tab)。

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 是的,重要的是要了解替换首先发生,然后再对文件进行任何其他分析。
      【解决方案4】:

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

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

      枚举似乎不相关。

      【讨论】:

        猜你喜欢
        • 2016-02-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-10
        • 1970-01-01
        • 1970-01-01
        • 2012-06-19
        • 1970-01-01
        相关资源
        最近更新 更多