我真的想做一些我可以用Java做的事情,但是无法找到有关命名变量的Objective-c方法.在java中:
private int var;
public void aMethod(int var)
{
this.var = var;
}
Run Code Online (Sandbox Code Playgroud)
在某些情况下,我真的想在方法参数和字段中使用相同的变量名.那可能吗?谢谢...
考虑这个头文件:
@interface MYClass : NSObject {
@private
int var; // 1
}
@property(nonatomic, assign) int var; // 2
-(void)someMethodWithVar:(int)var; // 3
@end
Run Code Online (Sandbox Code Playgroud)
在这种情况下,您有三个符号实例var:
由于所有三个实例都是不同的东西,var符号可以自由重用,它们不会发生冲突.但是在实施时someMethodWithVar:你可能遇到麻烦.
您可以分配属性:
-(void)someMethodWithVar:(int)var {
self.var = var;
}
Run Code Online (Sandbox Code Playgroud)
这将工作,但会给你警告"局部变量隐藏实例变量".它将按预期编译和工作.本地变量将拥有最高的总数,但当地的ivar永远不会解决,所以没问题.
您可以尝试直接分配ivar:
-(void)someMethodWithVar:(int)var {
var = var;
}
Run Code Online (Sandbox Code Playgroud)
仍然是相同的警告,但这次是致命的!你所做的是将局部变量分配给自己,一个无操作.
您可以尝试通过引用分配ivar self:
-(void)someMethodWithVar:(int)var {
self->var = var;
}
Run Code Online (Sandbox Code Playgroud)
仍然是一个警告,但不是致命的,因为你明确地解除了对伊瓦的影响self.
现在警告很糟糕,你应该把警告视为错误,特别是如果你是新手并且不是100%确定你做了什么.
有两种方法可以删除警告.我自己使用的第一种方法是始终使用_字符前缀命名实例变量.这样他们就不会与任何东西发生冲突,而且它们非常明确.
@interface MYClass : NSObject {
@private
int _var;
}
...
Run Code Online (Sandbox Code Playgroud)
第二种方法是更改参数名称.Apple历史上许多方法都是通过使用a或an作为前缀来实现的.
-(void)someMethodWithVar:(int)aVar;
Run Code Online (Sandbox Code Playgroud)