'a'前缀在String中表示什么?

时间:2010-04-15 21:17:02

标签: iphone objective-c iphone-sdk-3.0

我只是看NSString.h并想知道为什么一些方法声明args使用 (NSString *)string;,而其他人使用(NSString *)aString

这里有什么惯例?

4 个答案:

答案 0 :(得分:4)

它只是indefinite article "a",因为参数是“字符串”。在某些方法中,它们使它们更像英语。例如,compare:(NSString*)aString读作“比较字符串”。 method parameters的官方命名惯例是相当基本的;他们展示了使用不定冠词,但没有解释原因。

答案 1 :(得分:2)

Objective-C的面向对象的一半来自Smalltalk,这个惯例也是如此。

Smalltalk最初设计用于儿童,无需学习编程。后来,这个目标有所放松,而且更专注于领域专家进行最终用户编程。在这两种情况下,语言设计者都认为语言应该是一个引人注目的用户界面,因此他们非常关注最小的细节,比如方法签名中参数的命名。

方法签名本身是相当不寻常的在Smalltalk(和Objective-C),在参数和参数的的写的之后的名称(如在几乎每一个其他语言曾经发明过),而是方法的名称被分解成碎片,参数和参数在之间。这使得一些奇形怪状的方法名,但是当你阅读的全部的使用参数或参数签名,然后将它读起来几乎像在那个特定的方法在运行任何域的域行话一个句子。< / p>

因此,在磨机OO语言的某些运行中,用于在数组中的特定索引处存储值的方法可能如下所示:

store(i, obj)

甚至更糟,像这样:

public void store(int i, T obj)

或者这个:

store(self, i, obj)

甚至这个(来自我的最喜欢的语言):

[]=(i, obj)

(你怎么发音呢?)

可能会这样调用:

ary.store(3, "Hello")

或者这个:

ary[3] = "Hello"

可能标点符号少一些(例如在Io和Ioke中):

ary store(3, "Hello")

在Smalltalk中,签名如下所示:

at: anInteger put: anObject

就像这样调用:

anArray at: 3 put: "Hello".

如果您大声朗读签名,很明显 只是那里的无限期文章,否则它就是不正确的。

注意一些差异:在主流版本中,参数只能通过它们的位置来区分。因此,为了弄清楚它们的含义,你给它们描述性的名字。但是当你实际上调用方法时,那些描述性名称就会消失,因为参数会被参数替换。 (是的,我很清楚地意识到,i是不完全是一个描述性的名称。如果你愿意,你可以重复实验的东西,如copy(source, destination)copyFrom: aDirectory to: anotherDirectory)。

然而,在Smalltalk示例中,参数的语义在方法名称中编码,从而释放其他用法的参数名称。在这种情况下,键入注释(因为Smalltalk是隐式类型),或者,基本上是某种形式的匈牙利表示法。此外,当您调用方法时,编码的含义仍然存在于方法名称中。 (在上面的示例中,当您阅读copy(a, b)时,您不知道这是从a复制到b还是反过来,而是copyFrom: a to: b.没有歧义。您可以通过重命名方法来解决这个问题:copyFromTo(a, b),但这也不能很好地解读。)

现在,在Objective-C中,由于类型注释,所有这些都有点丢失。比较这两个签名,基本上描述了相同的方法:

at: anInteger put: anObject
- (void)insertObject:(id)anObject atIndex:(NSUInteger)index

不知何故,“大声读出英语句子”部分丢失了,但anObject的“an”前缀仍然存在。

无论如何,长话短说:这些前缀的原因与Objective-C的传统有关。

答案 2 :(得分:1)

这通常在setter和其他方法声明中完成,以避免与类的实例变量发生名称冲突。通常在制作者中你会看到:

variable = aVariable

答案 3 :(得分:0)

'aString'只是方法内部的输入变量的名称。很可能该函数已经使用了一个名为'string'的变量,所以它使用'aString'(比如'a string'或'some string')来区分它们,同时保持名称一般。无论如何,这就是我所相信的。