在我的iOS/Objective项目中,我经常使用API键之类的常量.h文件。直到今天,我一直将常量声明为static const,如下所示:
static NSString * const kAPIKey = @"wembvkejrvb43789gvbiu2bvfake";这很好,但不幸的是,我只能为原语和文本创建常量。其他对象(如UIColor对象)不能存储在这个常量中,因为它们不能用静态字面语法初始化(我的理解,引用是必需的)。
在阅读了一些C++文档之后,我了解了一些事情:
static是不必要的,因为const是隐式静态的。NSString * const x实际上是在x中声明一个常量和不变的值。我不能更改该值,但可能能够更改x指向的值。这些结论正确吗?
extern const有何不同?我假设它们是外部链接的(因此是extern关键字)。它们是在运行时定义的吗?我可以创建某种动态extern const,它可以用类方法返回的值来设置吗?
例如,我希望创建一个包含UIColor值的全局范围的常量。我想使用[UIColor colorWithRed:green:blue:alpha:]类方法来构造这个颜色值。这显然不适用于我一直使用的内部链接常量(我假设这是因为它发生在编译时),但是是否可以使用外部常量,可能是在+initialize方法中设置的呢?
任何关于这种行为细节的阐述都会非常有帮助。
发布于 2014-12-11 00:45:16
静态是不必要的,因为const是隐式静态的。
不,那不是真的。
static在文件作用域(即在任何方法或函数之外)使用时,意味着变量仅在该文件中可见。
extern意味着变量是在其他文件中定义的。
const意味着变量不能被修改。
考虑一下字符串。通常,您将有一个实现文件(名称以.m结尾),它定义了一些常量字符串指针:
NSString *const SomeString = @"some string";您可能希望在其他文件中使用相同的常量。如果是这样的话,您可以将一个声明添加到标头(名称以.h结尾)文件中,向编译器解释变量是在其他地方定义的:
extern NSString *const SomeString;这将允许您在导入头文件的任何文件中使用SomeString。另一方面,您可能会决定绝对不希望在实现文件之外使用常量。在这种情况下,您可以声明它为static (再次在实现文件中):
static NSString *const SomeString = @"some string";这将阻止它在文件之外使用。
调用
NSString * const x实际上是在x中声明一个常量和不变的值。我不能更改该值,但可能能够更改x指向的值。
对,它声明指针x是常量的--你不能改变它。如果它实际上是一个NSString,您也不能更改它所指向的值,因为实例NSString是不可变的。
此const具有内部链接,意味着该值是立即定义的(在编译时可以推定)。
我要看第五节--我不确定编译器是如何处理常量字符串的。不过,我认为使用它作为心智模型是安全的;在任何情况下,在代码使用字符串之前都会定义字符串。
发布于 2014-12-11 00:53:26
关于特定的编程问题,如何创建编译时定义的颜色对象:您不能,因为,除了语言提供文字语法的少数对象之外,对象是在运行时创建的。
但是您仍然可以在运行时优雅地完成它,而无需添加任何全局范围,就像sdk所做的那样.
@interface UIColor (RainbowAddition)
+ (UIColor *)chartruseColor;
@end
@implementation UIColor (RainbowAddition)
+ (UIColor *)chartruseColor {
// bonus: this is really chartruse... according to the internet
return [self colorWithRed:0.5 green:1.0 blue:0.0 alpha:1.0];
}
@endhttp://cloford.com/resources/colours/500col.htm
发布于 2014-12-11 01:15:08
目的- C是C的纯扩展,C++不是.
在全球范围:
const相当于extern const (外部链接);const等同于static const (内部链接)。在C(以及Objective)和C++中,要创建一个全局范围的const,您只需在一个源文件中定义它一次,比如extern const TYPE identifier = VALUE;,然后声明它(通常在头文件中),比如:extern const TYPE identifier; (读取它:我在全局链接级别的其他地方定义了这个const )。
https://stackoverflow.com/questions/27413196
复制相似问题