How to declare and use NSString global constants
Possible Duplicate:
Constants in Objective C
号
我在nsuserdefaults中存储一些应用程序设置。nsstrings用作键。问题是我需要使用这些nsstring键在整个应用程序中访问这些设置。在应用程序的某些部分中访问时,有可能输入错误的字符串键。
在整个应用程序中,我都有这样的声明
1 2 3 | [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"ReminderSwitch"]; BOOL shouldRemind = [[NSUserDefaults standardUserDefaults] boolForKey:@"ReminderSwitch"]; |
如何在何处声明全局nsstring常量,我可以在整个应用程序中访问该常量。然后我就可以使用这个常量,而不用担心输入错误。
首先,您应该使用真正的外部C符号,而不是宏。这样做:
一些文件.h
1 | extern NSString *const MONConstantString; |
一些文件.m
1 | NSString *const MONConstantString = @"MONConstantString"; |
。
请注意,如果使用Objc和Objc++的混合,您将需要为C++ TUS指定EDCOX1 OR 1,这就是为什么您会看到一个EDCOX1×2×D导出,它不同于语言。
然后,您将希望将常量放在它相关的接口附近。以您的示例为例,您可能需要一组接口或声明作为应用程序的首选项。在这种情况下,您可以将声明添加到
蒙纳普斯参考文献.h
1 | extern NSString *const MONApps_Pref_ReminderSwitch; |
蒙纳普斯参考文献.m
1 | NSString *const MONApps_Pref_ReminderSwitch = @"MONApps_Pref_ReminderSwitch"; |
。
使用中:
1 2 3 | #import"MONAppsPreferences.h" ... [[NSUserDefaults standardUserDefaults] setBool:YES forKey:MONApps_Pref_ReminderSwitch]; |
。
我认为你的想法是对的。例如,我创建了如下const.h/m文件:
常量H
1 2 3 | extern NSString *const UserIdPrefKey; extern NSString *const PasswordPrefKey; extern NSString *const HomepagePrefKey; |
常量m
1 2 3 4 5 | #import"AEConst.h" NSString *const UserIdPrefKey = @"UserIdPrefKey"; NSString *const PasswordPrefKey = @"PasswordPrefKey"; NSString *const HomepagePrefKey = @"UrlHomepagePrefKey"; |
号
只能导入常量h。
当您编写代码时,Xcode支持编写密钥名,这样您就可以避免错过输入。
最简单的方法是创建简单的.h文件,如utils.h,并在其中编写以下代码:
您似乎在寻找的只是一种在应用程序中定义字符串常量的方法。
看到这个问题我在下面引用了这个答案:
You should create a header file like
1
2
3
4 // Constants.h
FOUNDATION_EXPORT NSString *const MyFirstConstant;
FOUNDATION_EXPORT NSString *const MySecondConstant;
//etc.You can include this file in each file that uses the constants or in the pre-compiled header > for the project.
You define these constants in a .m file like
1
2
3 // Constants.m
NSString *const MyFirstConstant = @"FirstConstant";
NSString *const MySecondConstant = @"SecondConstant";Constants.m should be added to your application/framework's target so that it is linked in to the final product.
The advantage of using string constants instead of #define'd constants
is that you can test for equality using pointer comparison
(stringInstance == MyFirstConstant) which is much faster than string
comparison([stringInstance isEqualToString:MyFirstConstant]) (and
easier to read, IMO).
号
感谢巴里·沃克:)