在Objective-C中消除参数名称与实例变量名称的歧义的良好实践

Dav*_*d V 5 iphone cocoa objective-c ios

我在Objective-C中遇到了一个相当常见的场景,我将一个变量传递给一个init方法,然后将它分配给一个同名的实例变量.但是我没有找到一种方法来扩展变量的范围,以澄清哪个是来自message参数的值,哪个是实例变量.

说我有一些类,如下所示:

@interface MyObject
{
    NSString *value;
}
- (id)initWithValue:(NSString *)value;
@end
Run Code Online (Sandbox Code Playgroud)

在我的实现中,我希望我的init方法看起来像这样:

- (id)initWithValue:(NSString *)value
{
    self = [super init];
    if(self) {
        self.value = value;  // This will not work with instance variables
    }
}
Run Code Online (Sandbox Code Playgroud)

我知道三种解决方案:

  1. 创建一个允许调用的属性 self.value
  2. 重命名我的实例变量,例如 _value
  3. 重命名我的init参数变量,例如initValueargValue

我对这些解决方案都不满意.添加属性要么使该属性在接口上公开可用,要么如果我使用扩展,则将其隐藏在继承者中.我也不喜欢为变量设置不同的名称或使用下划线,这可能来自其他语言(如Java和C#)的开发.

有没有办法消除消息参数中的实例变量的歧义?如果没有,Cocoa中是否有编码指南来解决这个问题?我喜欢在适当的时候遵循风格指南.

更新

在考虑如何在C中执行此操作后,我想出了解决方案self->value.这有效,但它会产生一个编译器警告,即'value'Local声明隐藏了实例变量.所以这不是一个令人满意的解决方案,因为我有一个零警告目标.

Jos*_*ell 4

对于设置器(以及扩展初始化器),我相信约定是在参数名称前加上前缀new

- (void)setCrunk:(Crunk *)newCrunk;
- (id)initWithCrunk:(Crunk *)newCrunk;
Run Code Online (Sandbox Code Playgroud)

一般来说,我认为我见过的最常见的形式是调用参数theCrunk,但苹果似乎推荐 aCrunk