我真的很想做一些我可以在Java中做的事情,但无法找到如何在命名变量中使用objective-c。在java中:Objective c'this'等价于与方法参数同名的字段
private int var;
public void aMethod(int var)
{
this.var = var;
}
我真的很想在某些情况下为方法参数和字段使用相同的变量名称。那可能吗?谢谢...
我真的很想做一些我可以在Java中做的事情,但无法找到如何在命名变量中使用objective-c。在java中:Objective c'this'等价于与方法参数同名的字段
private int var;
public void aMethod(int var)
{
this.var = var;
}
我真的很想在某些情况下为方法参数和字段使用相同的变量名称。那可能吗?谢谢...
考虑这个头文件:
@interface MYClass : NSObject {
@private
int var; // 1
}
@property(nonatomic, assign) int var; // 2
-(void)someMethodWithVar:(int)var; // 3
@end
在这种情况下,你有符号var
的三个实例:
由于所有三个实例是不同的东西var
符号可以自由重用,他们不冲突。但是,在执行someMethodWithVar:
时,您可能会遇到麻烦。
您可以分配属性:
-(void)someMethodWithVar:(int)var {
self.var = var;
}
这是可行的,但会给你警告“局部变量隐藏了实例变量”。它将按预期进行编译和工作。本地变量将有最高的主持人,但当地的伊娃不会解决,所以没问题。
您可以尝试伊娃直接分配:
-(void)someMethodWithVar:(int)var {
var = var;
}
仍然是同样的警告,但是这一次却是致命的!你所做的是将本地变量分配给自己,这是一个无操作。
你可以尝试参考以分配给伊娃self
:
-(void)someMethodWithVar:(int)var {
self->var = var;
}
仍然是一个警告,但因为你明确地通过self
不是致命的取消引用伊娃。
现在的警告是坏的,你应该把警告视为错误,特别是如果你是新手而不是100%确定你做了什么。
有两种方法可以删除警告。我自己使用的第一种方法是始终使用_
字符前缀来命名实例变量。这样他们就不会与任何东西发生冲突,而且它们非常明确。
@interface MYClass : NSObject {
@private
int _var;
}
...
第二种方法是更改参数名称。历史上许多苹果公司自己的方法都是通过使用a
或an
作为前缀。
-(void)someMethodWithVar:(int)aVar;
事实上,你甚至可以用'self.var = VAR;'=) – elslooo
我更喜欢其他的语法,因为它使得它清楚地表明它要调用一个方法。但它确实只是语法糖。 :) –
我认为下划线前缀使事情非常干净 - 感谢您的建议! –