公共静态最终变量的等价物

And*_*w S 7 syntax objective-c extern variable-declaration

我理解将单词放在extern头文件中的变量声明之前声明存在一个全局静态变量而不初始化它.我也明白,如果我导入包含extern变量的文件,我可以在没有类/文件名的情况下引用它们.但是,在哪里定义它们及其价值?

我想要做的是创建一个具有全局常量的常量类,我想在整个iOS应用程序的代码中使用它们.

有人把它们放在界面里面吗?

example.h文件

#import <Foundation/Foundation.h>
@interface Constraints : NSObject
{

extern   NSString * const PREFS_NAME;

}
Run Code Online (Sandbox Code Playgroud)

或者就像这样放在接口之外

example.h文件

#import <Foundation/Foundation.h>

extern   NSString * const PREFS_NAME;    

@interface Constraints : NSObject
{

}
Run Code Online (Sandbox Code Playgroud)

然后在实现.m文件中如何初始化extern值?

在这样的实施区域内?

Example.m

#import "Constraints.h"

@implementation Constraints

/**PRefecences name for the application**/
const  NSString * PREFS_NAME = @"MyApp_Prefs";

@end
Run Code Online (Sandbox Code Playgroud)

或者在实现区域之外初始化它们,如下所示:

Example.m

#import "Constraints.h"

/**PRefecences name for the application**/
const  NSString * PREFS_NAME = @"MyApp_Prefs";

@implementation Constraints

@end
Run Code Online (Sandbox Code Playgroud)

或者我在构造函数中提供它们的初始值?或者+在它前面的一些任意的静态样式方法,即+(void) setAppConstraints;

我尝试了几种组合,但总是遇到错误,例如"使用不同类型重新定义'xVariable'".或者关于"extern没有初始化界面"的东西(或类似的东西,我忘了).所以我想知道如何正确地声明和初始化它们以形成与public static finalJava中的变量相同的角色.

extern命令的限制是什么?我知道我可以extern一个NSIntegerNSString,但怎么样NSArray

我问这个问题,因为似乎有很多关于externObjective-C 使用的误导性或不完整的信息.许多答案似乎都是猜测性的.我希望这个问题不仅对我来说是一个很好的资源,而且是为了限制关于基础知识的更多类似问题extern.

Ram*_*uri 13

你在它声明的文件中定义它的值,在你的例子中是Example.m; 您仍然可以重新分配此变量,因此Example.h中的声明如下所示:

extern  NSString * PREFS_NAME;
Run Code Online (Sandbox Code Playgroud)

这样,导入Example.h的每个文件都可以访问此变量.Objective-C中公共静态final的等价物是const.如果你也希望它是公共的,你应该把它变成一个类实例变量,但在这种情况下你不需要它,因为它已经可以在任何地方访问.所以在这种情况下它将是:

// .m file
NSString* const PREFS_NAME = @"MyApp_Prefs";
// .h file
extern NSString* const PREFS_NAME;
Run Code Online (Sandbox Code Playgroud)

另请注意,const NSString*与NSString*const不同.后者是指向NSString的const指针.即使它是正确的语法,前者也没有意义.在Objective-C中,const限定符不影响对象,而是有可变和不可变的类.它在C++中有意义,意味着你可以在实例上使用const方法.