如何理解Objective C中带有多个参数的消息的语法?

时间:2010-08-16 08:20:56

标签: objective-c methods message

我知道Objective C使用'interleaved arguments',它是设计的。

但是我想知道为什么你认为这会让生活更容易将第一个参数的名称合并到消息名称中。见下文:

正确:[myRectangle setOriginX: 30.0 y: 50.0]
而不是 错了:[myRectangle setOrigin x: 30.0 y: 50.0]

[receiver message argument1:value1 argument2:value2...]<<<对你们来说这不是一个更清晰直观吗?

3 个答案:

答案 0 :(得分:4)

尝试最短的答案:

是的:)

答案 1 :(得分:3)

它更容易实现,因为那时选择器实际上只是方法的“名称”作为字符串,参数可以按照给定的顺序传递给方法。这使得Objective-C可以很容易地写成一个小的预处理器+一组在C之上的运行时函数,它最初就是这样。否则会更复杂。

它也更简单,因为Objective-C的消息传递语法是从Smalltalk派生的,Smalltalk使用与执行选择器完全相同的方式(虽然它不是C的预处理器),所以这是对Smalltalk语法的零改变。

你似乎在问为什么Objective-C没有从几十年后流行的语言中获取其设计线索。答案是:因为他们还没有。 (到目前为止,我不确定关键字参数在Lisp中是否常见,但它们并不适用于大多数编程语言。)

答案 2 :(得分:2)

我认为您正在尝试理解Objective-c将其与Java或C ++等OOP编程语言相关联,我不建议这样做。随着时间的推移,你会理解并喜欢Objc方法,我花了6个月才真正享受它,现在我只喜欢ObjC开发:p。
无论如何ObjC人。说以下内容:

  

方法的实际名称   (insertObject:atIndex :)是一个   所有签名的串联   关键字,包括冒号字符。   冒号字符声明了   存在参数。如果一个方法   没有参数,省略冒号   在第一个(也是唯一的)签名之后   关键词。在这个例子中,该方法   有两个参数。

Source: Methods and Messaging


修改
ObjC命名方法的方式,我更喜欢它因为我不必考虑方法名称,而是关于我想发送给对象的哪些消息(“由其他对象表示”) A 这样我就能得到我想要的东西;

NSArray *list = [object_a fromCategory:@"Literature" authorsStartingWith:@"Em"];


要么

NSArray *list2 = [object_a fromCategory:@"Literature" authorsStarginWith:@"EM" fromCentury:@"16"]



尝试使用自然语言并将消息转换为object_a,例如: “嘿对象给我一个类别文献所有作者stargin与”em“,它们来自cetury 16” - 这是消息 - 你不需要一个单独的方法名称 - 所有在一起可以看作一个方法名称(正如男人所说)。
你现在知道ObjC是如何优雅和清晰地做你曾经称之为“方法重载”的方式吗?