我正在开发一个Cocoa应用程序,我使用常量nsstring作为存储我的首选项的键名的方式。
我知道这是一个好主意,因为它允许在必要时轻松更改密钥。 此外,这是整个“将数据与逻辑分离”的概念。
不管怎样,有没有一种好方法让这些常量在整个应用程序中定义一次?
我相信有一种简单而聪明的方法,但现在我的类只是重新定义它们所使用的方法。
我正在开发一个Cocoa应用程序,我使用常量nsstring作为存储我的首选项的键名的方式。
我知道这是一个好主意,因为它允许在必要时轻松更改密钥。 此外,这是整个“将数据与逻辑分离”的概念。
不管怎样,有没有一种好方法让这些常量在整个应用程序中定义一次?
我相信有一种简单而聪明的方法,但现在我的类只是重新定义它们所使用的方法。
当前回答
如果你喜欢命名空间常量,你可以使用struct,周五问答2011-08-19:命名空间常量和函数
// in the header
extern const struct MANotifyingArrayNotificationsStruct
{
NSString *didAddObject;
NSString *didChangeObject;
NSString *didRemoveObject;
} MANotifyingArrayNotifications;
// in the implementation
const struct MANotifyingArrayNotificationsStruct MANotifyingArrayNotifications = {
.didAddObject = @"didAddObject",
.didChangeObject = @"didChangeObject",
.didRemoveObject = @"didRemoveObject"
};
其他回答
如果你想要全局常数;一种快速但肮脏的方法是将常量声明放入PCH文件中。
简单的方法:
// Prefs.h
#define PREFS_MY_CONSTANT @"prefs_my_constant"
更好的办法:
// Prefs.h
extern NSString * const PREFS_MY_CONSTANT;
// Prefs.m
NSString * const PREFS_MY_CONSTANT = @"prefs_my_constant";
第二种方法的一个好处是,改变常量的值不会导致整个程序的重新构建。
如果你想调用nsstring。newline;从objective c,你想要它是静态常量,你可以在swift中创建这样的东西:
public extension NSString {
@objc public static let newLine = "\n"
}
这样你就有了很好的可读的常量定义,并且可以从你选择的类型中获得,同时还可以绑定到类型的上下文。
我通常使用Barry Wark和Rahul Gupta发布的方法。
虽然,我不喜欢在.h和.m文件中重复相同的单词。 注意,在下面的例子中,这一行在两个文件中几乎是相同的:
// file.h
extern NSString* const MyConst;
//file.m
NSString* const MyConst = @"Lorem ipsum";
因此,我喜欢使用一些C预处理器机制。 让我通过例子来解释。
我有一个头文件,它定义宏STR_CONST(名称,值):
// StringConsts.h
#ifdef SYNTHESIZE_CONSTS
# define STR_CONST(name, value) NSString* const name = @ value
#else
# define STR_CONST(name, value) extern NSString* const name
#endif
h/里的。m对,我想定义常数,我这样做:
// myfile.h
#import <StringConsts.h>
STR_CONST(MyConst, "Lorem Ipsum");
STR_CONST(MyOtherConst, "Hello world");
// myfile.m
#define SYNTHESIZE_CONSTS
#import "myfile.h"
等,瞧,我有关于常数的所有信息在.h文件只有。
正如Abizer所说,您可以将其放入PCH文件中。另一种不那么脏的方法是为所有键创建一个包含文件,然后将其包含在您使用键的文件中,或者将其包含在PCH中。在它们自己的包含文件中,至少给了您一个查找和定义所有这些常量的地方。