【问题标题】:Class constants without naming collision无命名冲突的类常量
【发布时间】:2017-01-23 16:32:49
【问题描述】:

我已经看到了很多定义常量的答案,只需在 .h 文件中使用 extern int const Something 并在 .m 文件中使用 int const Something = 1

但问题是 - 这些不是类常量,我不能将它们与 .表示法或使用其他机制来区分所属类。

例如,

ClassA.h

extern int const SomeErrorCode;

ClassB.h

extern int const SomeErrorCode;

然后我有 ClassC.m 我想同时使用 ClassA 和 ClassB 并检查它们的方法错误代码:

#import <ClassA.h>
#import <ClassB.h>

@implementation ClassC

-(void)doIt
{
     ClassA * objA = [[ClassA alloc] init];
     ClassB * objB = [[ClassB alloc] init];

     int resultA = [objA doSomething];
     // how do I check for resultA == ClassA.SomeErrorCode ?

     int resultB = [objB doSomething];
     // how do I check for resultB == ClassB.SomeErrorCode ?
}

@end

如果 ClassA.SomeErrorCode 和 ClassB.SomeErrorCode 具有不同的值,如何确保我可以同时使用这两个类并且不会发生冲突?

【问题讨论】:

  • 当我使用extern 时,我使用前缀(就像我创建类时所做的那样),并给出将它们链接到定义它们的类的名称,如果是,则使用“k” const,而不是如果它们是静态的。喜欢extern int const kAFMyClassAErrorCode
  • 你有没有想过为什么它们是命名为UITextFieldTextDidChangeNotification而不是TextDidChange的常量?
  • 是的,这让我觉得“哎呀,Objective-C 太乱了”。如果没有其他更清洁的选择,我想我必须习惯它。
  • 不是“乱七八糟”,Objective-C和它的“规则”相当“冗长”,这只是一种习惯。另外,命名方法,var 也不能掉以轻心。

标签: objective-c class constants collision naming


【解决方案1】:

如果您不需要在定义它们的文件之外引用常量,则不要在 .h 文件中声明它们。如果没有这些声明,链接器将看不到它们,也不会有名称冲突。

如果您确实需要常量在其他模块中可见,则需要为它们组成全局唯一的名称。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 2014-07-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-22
    • 2013-01-12
    相关资源
    最近更新 更多