我有A级和B级。
B类子类A类 A类具有静态常量NSString变量
在B类方法中,我需要使用Class A的静态常量NSString变量。我有哪些选择?
我尝试再次声明同样的事情,但导致问题(内部不一致),尝试不使用(说,变量未声明)。
知道如何解决这个问题吗?
感谢。
答案 0 :(得分:8)
使类方法返回该常量,如下所示:
+(NSString*) constString {
return myConstString;
}
答案 1 :(得分:4)
您可以在.h文件中声明静态常量字符串。这样它们是公共的,可以被导入头文件的其他类使用,包括你的子类。
或者,您可以使用extern:
声明对B类中字符串的引用extern NSString *const MyString;
这基本上告诉编译器该字符串的值是在代码中的其他位置定义的,并且不必担心它。
答案 2 :(得分:3)
通过“A类有一个静态常量NSString变量”,我假设您指的是类A .m文件中定义的类似内容:
static NSString * const MyString = @"MyString";
@implementation ClassA
@end
要允许A类及其子类查看值,您可以执行以下操作:
MDClassAPrivate.h:
#import <Foundation/Foundation.h>
static NSString * const MDBlahBlahKey = @"MDBlahBlah";
MDClassA.h:
#import <Foundation/Foundation.h>
@interface MDClassA : NSObject {
}
@end
MDClassA.m:
#import "MDClassA.h"
#import "MDClassAPrivate.h"
@implementation MDClassA
@end
MDClassB.h:
#import "MDClassA.h"
@interface MDClassB : MDClassA {
}
@end
MDClassB.m:
#import "MDClassB.h"
#import "MDClassAPrivate.h"
@implementation MDClassB
@end
通过将静态const变量移动到单独的文件,您可以允许任何类在实现文件中导入它们。
答案 3 :(得分:1)
我对这个问题的个人解决方案是一个伪保护方法,它返回常量字符串。
// ClassA.m
@interface ClassA ()
- (NSString *)constantString;
@end
@implementation ClassA
- (NSString *)constantString {
return @"MyConstantString";
}
@end
然后继续进入你的子类:
// ClassB.m
@interface ClassA ()
// This is a method redeclaration to avoid build warnings
- (NSString *)constantString;
@end
@implementation ClassB
- (void)someMethod {
NSString *theConstantString = [self constantString];
// do stuff...
}
@end
这里的假设是你的常量字符串确实是常量,如果你想要它是动态的,你需要稍微修改这个解决方案,但它仍然可以处理它。
答案 4 :(得分:1)
您可以使用'userDefaults'设置整个应用程序中可访问的值。
[[NSUserDefaults standardUserDefaults] setObject:object forKey:@"objectKey"];