下面的代码是什么意思?
#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];
答案 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是存储所选选项卡的默认首选项的(字符串)名称。 读取首选项后,在选项卡栏上再次选择先前选择的选项卡。可能这是在应用程序重启时完成的。
枚举似乎并不相关。