我是客观的新手。我在一个类文件中添加了一个接口,并在那里声明了一些变量。编译时,在所有声明中显示“在@interface和@protocol中声明变量”错误。 这是示例代码
#import "State.h"
@interface State(private)
NSString *forgotPassword=nil;
NSMutableArray *CategorySelection = nil;
NSMutableArray *subCategorySelection= nil;
NSString *string = nil;
int Tag= 0;
int alertTag=0;
NSURL *stringURL =nil;
NSURL *videoURL =nil;
NSURL *imageURL = nil;
int loginCount = 0;
NSMutableArray *album;
NSString *videoFileName = nil;
int videoCounting=0;
int loginUserId = 0;
int ImageTagg = 0;
@end
@implementation State
+(void) setforgotPasswordText:(NSString *) passwordText{
forgotPassword = passwordText;
}
我是初学者,所以请指导我解决这个问题。感谢。
答案 0 :(得分:4)
看起来你在班上宣布了category;您无法在类别中添加实例变量。
但是,您可以在类扩展中添加它们。为此,删除类别的名称(private
),并删除初始化,保留代码如下:
@interface State () {
// Note how the initialization is gone:
NSString *forgotPassword;
NSMutableArray *CategorySelection;
// More variables; no initialization!
}
// More stuff...
@end
所有初始化都需要在指定的初始值设定项中进行(例如您的init
方法),如下所示:
-(id)init {
if (self = [super init]) { // Yes, it's =, not ==
// Perform all your initialization here:
*forgotPassword= ...;
*CategorySelection = ...;
}
return self;
}
答案 1 :(得分:3)
如果您只想声明一个新类State
,则声明您的实例变量(在大括号内,没有显式初始化):
@interface State
{
NSString *forgotPassword;
NSMutableArray *categorySelection;
NSMutableArray *subCategorySelection;
NSString *string;
int tag;
int alertTag;
NSURL *stringURL;
NSURL *videoURL;
NSURL *imageURL;
int loginCount;
NSMutableArray *album;
NSString *videoFileName;
int videoCounting;
int loginUserId;
int imageTag;
}
@end
如果您正在使用ARC,则无需初始化它们,因为它会将所有这些设置为零或零。如果您不使用ARC(但为什么不使用ARC),则可以使用init
方法初始化这些。
我注意到你正在编写自己的“setter”(例如setForgotPassword
)。如果您希望编译器为您执行此操作(即为您“合成”它们),请首先将这些变量声明为属性,例如:
@interface State
@property (nonatomic, strong) NSString *forgotPassword;
@property (nonatomic, strong) NSMutableArray *categorySelection;
@property (nonatomic, strong) NSMutableArray *subCategorySelection;
@property (nonatomic, strong) NSString *string;
@property int tag;
@property int alertTag;
@property (nonatomic, strong) NSURL *stringURL;
@property (nonatomic, strong) NSURL *videoURL;
@property (nonatomic, strong) NSURL *imageURL;
@property int loginCount;
@property (nonatomic, strong) NSMutableArray *album;
@property (nonatomic, strong) NSString *videoFileName;
@property int videoCounting;
@property int loginUserId;
@property int imageTag;
@end
在声明属性后,您现在可以让编译器合成“setter”和“getters”。对于这些@property
声明,如果您正在使用最新的编译器(Xcode 4.4 ...大约一周前出现),您不需要在{{1}中明确@synthesize
它们}}。但是,如果您使用的是早期编译器,则需要为所有@implementation
声明添加@synthesize
,例如。
@property
如果你这样做(声明一个@implementation State
@synthesize forgotPassword = _forgotPassword;
@synthesize categorySelection = _categorySelection;
@synthesize subCategorySelection = _subCategorySelection;
@synthesize string = _string;
// etc.
然后@property
它),编译器将在幕后为你创建一个实例变量,然后自动生成一个“setter”(即方法是“set”,后跟您的变量名称,例如“setForgotPassword”)和“getter”方法(与您的变量同名的方法,它将为您检索变量内容)为您的每个属性。注意,对于所有这些属性,@synthesize
也将生成实例变量,但是通过在ivar名称之前包含下划线,您将确保不会将属性@synthesize forgotPassword = _forgotPassword
与实例混淆变量self.forgotPassword
。
如果您希望它成为一个类别(基本上是要添加要应用于现有类的新方法,通过引用现有类指定,_forgotPassword
后跟类别指示符State
) ,那么你不能包含新的变量。我不知道这是不是你的意图(我对此表示怀疑)。但是,如果你真的想这样做但你真的需要这些新变量,你可以改为继承你现有的State (private)
类,如下所示:
State
如果您注意到,我还更改了您的变量名称以符合初始小写字母的Apple惯例。类以大写开头,变量以小写开头。
答案 2 :(得分:0)
变量声明应该在括号内,应该是这样的
@interface State(private)
{
NSString *forgotPassword;
NSMutableArray *CategorySelection;
NSMutableArray *subCategorySelection;
NSString *string;
int Tag;
int alertTag;
NSURL *stringURL;
NSURL *videoURL;
NSURL *imageURL;
int loginCount;
NSMutableArray *album;
NSString *videoFileName;
int videoCounting;
int loginUserId;
int ImageTagg;
}
-(void)sampleMethod1;
-(void)sampleMethod2;
-(void)sampleMethod3;
@end
在Brackets之后,您可以声明在类
中使用的方法答案 3 :(得分:0)
问题是你正在@interface本身初始化变量。您只能声明变量,初始化在@implementation中完成。
因此你的@implementation应该包含,
@implementation
forgotPassword=nil;
CategorySelection = nil;
subCategorySelection= nil;
string = nil;
Tag= 0;
alertTag=0;
stringURL =nil;
videoURL =nil;
imageURL = nil;
loginCount = 0;
videoFileName = nil;
videoCounting=0;
loginUserId = 0;
ImageTagg = 0;
@end
,而@interface包含,
@interface State
NSString *forgotPassword;
NSMutableArray *CategorySelection;
NSMutableArray *subCategorySelection;
NSString *string;
int Tag;
int alertTag;
NSURL *stringURL;
NSURL *videoURL;
NSURL *imageURL;
int loginCount;
NSMutableArray *album;
NSString *videoFileName;
int videoCounting;
int loginUserId;
int ImageTagg;
@end
请注意,私有关键字已被删除。为了在objectice C中声明私有变量,我们在 .m 文件本身中声明它们。下面给出一个例子,
.h文件
@interface classname{
// variable declaration
}
//variable property declaration
//method declaration
@end
.m文件
@interface classname()
//private variables
@end
@implementation
//do your logic here
@end