Objective-C常量类

6
我目前在几个viewController和NSObject类中编写了一些常数。我的一个同事建议我将它们放到一个独立的类(即常量类)中。
我想知道这种设计的优缺点是什么,以及是否应该这样做。如果需要,希望能对如何实现进行解释。
例如,我只需创建一个新的NSObject类,并在其中添加一堆#define吗?然后当我需要使用它们时,我只需子类化我的常量类,并像使用其他类的方法或变量一样使用这个类中的常量?
比如:
myclass.theConstant

任何帮助都将不胜感激。

1
Manjunath 在这里发布了一个极好的答案:https://dev59.com/dXE95IYBdhLWcg3wSb7P#2377432 - C4 - Travis
2个回答

11

将常量与使用它们的内容放在一起。不要创建一个全局的“所有常量”文件。这会使代码重用变得非常困难。例如,如果您发布通知,您需要一个通知名称字符串。因此,将其放在发布通知的类中:

.h
extern NSString * const MYObjectDidSomethingNotification;

.m
NSString * const MYObjectDidSomethingNotification = @"MYObjectDidSomethingNotification";

常量通常不是方法或定义,它们只是像上面那样的全局常量。你应该尽可能避免使用 #define,但有些情况下它非常有用(比如常量 UIColor 对象,否则初始化会很麻烦)。

花一点时间在苹果的头文件中看看例子。在 UIWindow.h、UITableViewCell.h 和 UITableView.h 中查找几个好的常量定义示例。


好的,谢谢你的回复。为什么 #define 不好?只是出于好奇。 - C.Johns
我也在想为什么宏定义不适合常量。是因为缺乏类型安全性吗? - borrrden
4
作用域。类型安全。可在调试器中评估。更好的信息隐藏。更改常量不需要重新编译整个程序。当宏定义意外重新定义时,避免令人费解的编译问题。有一些情况下需要使用#define,在少数情况下也是首选。但你的默认应该是用Objective-C来编写代码,而不是预处理器宏语言。再次看看苹果SDK,你会注意到除了非常特定的情况(如NSAssert)之外,缺乏#define的明显。 - Rob Napier

0

如果你只有#define,它们不需要在任何类中--只需将它们放入自己的.h文件中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接