1

我是目标 c 的新手。我在一个类文件中添加了一个接口,并在那里声明了一些变量。编译时在所有声明中显示“不能在@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;
}

我是初学者,所以指导我解决这个问题。谢谢。

4

4 回答 4

4

看起来您在班级中声明了一个类别;您不能在类别中添加实例变量。

但是,您可以将它们添加到类扩展中。为此,删除类别 ( 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;
}
于 2012-07-30T04:42:47.077 回答
4

如果你只想声明一个新类,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(但你为什么不使用),你会在你的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”和“getter”。对于这些@property声明,如果您使用的是最新的编译器(Xcode 4.4 ... 大约一周前发布),则无需@synthesize@implementation. 但是,如果您使用的是较早的编译器,则需要包含@synthesize所有@property声明,例如

@implementation State

@synthesize forgotPassword = _forgotPassword;
@synthesize categorySelection = _categorySelection;
@synthesize subCategorySelection = _subCategorySelection;
@synthesize string = _string;
// etc.

如果你这样做(声明 a@property然后@synthesize它),编译器将在幕后为你创建实例变量,然后自动生成一个“setter”(即一个方法是“set”后跟你的变量名,例如“setForgotPassword”)和每个属性的“getter”方法(与变量同名的方法,它将为您检索变量内容)。请注意,对于所有这些属性,@synthesize forgotPassword = _forgotPassword也将生成实例变量,但通过在 ivar 名称前包含下划线,您将确保不会将属性self.forgotPassword与实例变量混淆_forgotPassword

如果您希望它是一个类别(基本上是添加要应用于现有类的新方法,通过引用现有类指定,State后跟类别指示符,State (private)),那么您不能包含新变量。我不知道这是否真的是你的意图(我怀疑)。但是,如果您真的想这样做,但您确实需要这些新变量,您可以改为子类化现有State类,如下所示:

@interface StateSubClass : 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

如果您注意到,我还更改了您的变量名称以符合 Apple 的首字母小写约定。类以大写字母开头,变量以小写字母开头。

于 2012-07-30T04:44:55.957 回答
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

在括号之后,您可以声明在类中使用的方法

于 2012-07-30T04:40:38.753 回答
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

请注意,private关键字已被删除。为了在 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
于 2012-07-30T05:42:45.627 回答