在Objective-C中消除歧义参数名称与实例variables名称的好习惯
我在Objective-C中遇到了一个相当常见的情况,在这里我将一个variables传递给一个init方法,然后将其分配给一个同名的实例variables。 不过,我还没有find一种方法来确定variables的范围,以明确哪些是来自消息参数的值,哪些是实例variables。
说我有一些类如下:
@interface MyObject { NSString *value; } - (id)initWithValue:(NSString *)value; @end
在我的实现中,我希望我的init方法看起来像这样:
- (id)initWithValue:(NSString *)value { self = [super init]; if(self) { self.value = value; // This will not work with instance variables } }
我知道三个解决scheme:
- 创build一个允许调用
self.value
的属性 - 重命名我的实例variables,如
_value
- 重命名我的init参数variables,如
initValue
或argValue
我不满意这些解决scheme。 添加属性可以使该属性在接口上公开,或者如果我使用扩展名,则将其从inheritance者隐藏。 我也不喜欢为variables使用不同的名称,或者使用下划线,这可能来自其他语言(如Java和C#)的开发。
有没有办法从消息参数中消除实例variables的歧义? 如果没有,Cocoa有没有一个编码准则来解决这个问题? 在适当的时候,我喜欢下面的风格指导
更新
在思考如何在C中做到这一点后,我提出了self->value
的解决scheme。 这是有效的,但是它产生了一个编译器警告: “值”的本地声明隐藏了实例variables。 所以这不是一个令人满意的解决scheme,因为我有一个零警告的目标。
对于setter(以及通过扩展初始值设定项),我相信约定是在参数名称的前面加上new
:
- (void)setCrunk:(Crunk *)newCrunk; - (id)initWithCrunk:(Crunk *)newCrunk;
总的来说,我认为我见过的最常见的forms是调用参数theCrunk
,但是苹果似乎推荐了一个“ aCrunk
。
并将名称更改为“inValue”不是一个好主意? 你在这里有什么 – 你的“解决scheme”是复杂的,特别是Obj-C 2的访问器等。由于self.value和inValue是不同的东西,它们需要不同的名称。
请注意,您可以使用
-(void)method1:(NSString*)value;
在标题中
和
-(void)method1:(NSString*)inValue;
在.m文件中。
如果你只使用1,编译器会给你一个警告。
你可以结合使用1和2:
@synthesize value = _value;
如果你想从inheritance者隐藏你的variables,你可以声明一个空的命名类别并在那里声明你的属性。
对于3,你可以使用一个值作为你的参数。