gpt4 book ai didi

objective-c - 接口(interface)中的变量声明问题

转载 作者:行者123 更新时间:2023-12-01 17:27:04 25 4
gpt4 key购买 nike

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

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

最佳答案

如果你只想声明一个新类,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 中初始化这些。方法。

而且我注意到您正在编写自己的“二传手”(例如 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.

如果你这样做(声明一个 @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 的首字母小写约定。类以大写字母开头,变量以小写字母开头。

关于objective-c - 接口(interface)中的变量声明问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11715461/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com