gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 04:24:02 24 4
gpt4 key购买 nike

我在 Objective-C 中遇到了一个相当常见的场景,我将一个变量传递给一个 init 方法,然后想将它分配给一个同名的实例变量。但是,我还没有找到一种方法来确定变量的范围,以阐明哪个是消息参数的值,哪个是实例变量。

假设我有一些类如下:

@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
}
}

我知道三种解决方案:

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

我对这些解决方案中的任何一个都不满意。添加一个属性要么使该属性在界面上公开可用,要么如果我使用扩展,则对继承者隐藏它。我也不喜欢为变量使用不同的名称或使用下划线,这可能来自于使用其他语言(例如 Java 和 C#)进行开发。

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

更新

在思考如何在C中做到这一点后,我想到了self->value的解决方案。这可行,但它会产生一个编译器警告,提示 “值”的本地声明隐藏了实例变量。因此这也不是一个令人满意的解决方案,因为我有一个零警告目标。

最佳答案

对于 setter (以及扩展初始化器),我认为约定是在参数名称前加上 new 前缀:

- (void)setCrunk:(Crunk *)newCrunk;
- (id)initWithCrunk:(Crunk *)newCrunk;

一般来说,我认为我见过的最常见的形式是调用参数theCrunk,但是Apple seems to recommend aCrunk.

关于iphone - 在 Objective-C 中消除参数名称与实例变量名称歧义的良好做法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8747476/

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