稍微吐槽一下ObjC的函数调用

2013-10-08 16:20:38 +08:00
 Ricepig
ObjC的方法调用(消息传递)的写法首先是类/对象,然后是消息,然后是参数。这别扭的地方在于函数名和后面的参数名并列。举个栗子:

[UIColor colorWithRed:134/255.0f green:198/255.0f blue:124/255.0f alpha:1.0]

这尼玛是不是还有

[UIColor colorWithBlue:134/255.0f green:98/255.0f blue:124/255.0f alpha:1.0]



[UIColor colorWithGreen:134/255.0f red:198/255.0f blue:124/255.0f alpha:1.0]

方法的第一个参数参数名默认,第二个开始指定参数名,怎么写怎么觉得有点奇怪。
6669 次点击
所在节点    程序员
82 条回复
66450146
2013-10-08 16:24:43 +08:00
只有第一种

整行都是方法名,而不是像你想的一样第一个是参数名。可以认为第一个参数的名称隐含在方法名的第一部分里面
spoony
2013-10-08 16:25:13 +08:00
感觉和人类语言习惯很接近
bytelee
2013-10-08 16:46:42 +08:00
一开始怪 后来你会喜欢上他的
PrideChung
2013-10-08 16:49:46 +08:00
习惯了就好,这种风格的好处是你不太可能搞错参数顺序。
chchwy
2013-10-08 16:54:11 +08:00
函數的簽名是
UIColor colorWithRed:green:blue:alpha:


別誤解為python那種named parameter了,red green blue alpha不能互換順序,也不能省略的,整串都是函數的名字。
sharkli
2013-10-08 16:59:31 +08:00
习惯了很舒服的。参数不会写错哈哈。
Ricepig
2013-10-08 17:04:26 +08:00
@66450146 第一个参数名隐含,第二个后的参数名不隐含,这种不一致非常蛋疼。也会引发我说的那个问题。
Ricepig
2013-10-08 17:06:47 +08:00
@chchwy 让我觉得蛋疼的是

为什么不是UIColor.color(red, green, blue, alpha)。

我并不是觉得blue:xxx,green:xxx这种方式蛋疼,而是觉得"第一个参数特殊的语法,并影响到函数名"这种规则很奇怪。
Ricepig
2013-10-08 17:08:28 +08:00
@spoony 要看是哪种语言了,和中文习惯就不太一样。
alexrezit
2013-10-08 17:10:19 +08:00
@Ricepig
你觉得 blah.blahblah(-1, NULL, 0, 0, 1, TRUE, NULL, 0, -1) 这样就爽了? 你知道哪个参数是做什么的?
而且第一个参数哪里有特殊语法了? 我写了三年多 Objective-C 怎么不知道?
PrideChung
2013-10-08 17:14:14 +08:00
@Ricepig 因为 Objective-C 不是Java。第一个参数名隐含这个问题不大,一般方法的命名都会写成 initWithFoo, barForFoo 这种风格,读起来就像英语一样。

PS: Objective-C 方法命名还相当注意语法的正确性,例如时态和单复数。例如 NSArray 检查一个元素是否存在的方法是 containsObject:
Ricepig
2013-10-08 17:14:41 +08:00
@alexrezit 麻烦仔细看一下贴

第一个参数隐含了名字,造成第一个参数非常特殊,首先它是唯一不用指定参数名的参数,其次方法在命名时还要考虑隐含第一个参数的名字,就出现了colorWithRed这种蛋疼的方法名。
Ricepig
2013-10-08 17:18:19 +08:00
@PrideChung 语法的正确性在很多库里都是被特别关注的。但是Objective-C的命名里最蛋疼的是很多类都有前缀,例如NS。就不能使用namespace吗?

为什么Java里问题就大,ObjC问题就不大?java照样可以写Color.CreateWithRed(255)。就我说的这个例子,感觉并不像英语,后面接一大溜那是啥?

其实我吐槽的还是第一个参数的特殊性。
alexrezit
2013-10-08 17:18:58 +08:00
@Ricepig

方法名不是:
colorWithRed

方法名是:
-colorWithRed:green:blue:alpha:
Ricepig
2013-10-08 17:20:57 +08:00
@alexrezit 你说的这一长串是函数签名吧。
txx
2013-10-08 17:30:24 +08:00
@Ricepig
[UIColor colorWithRed:1
green:1
blue:1
alpha:1];
其实是这样的 所有参数是并列的....
fgwww
2013-10-08 17:30:32 +08:00
color with Red green blue alpha...这么读起来有什么不对?
难道要color ,red green blue alpha?
elden
2013-10-08 17:31:52 +08:00
objc中没有命名参数,冒号前面的描述只是它的方法签名的组成之一。
PrideChung
2013-10-08 17:33:31 +08:00
@Ricepig @Ricepig Color.CreateWithRed(255) 请告诉我如果要指定green和blue还有alpha怎么办, 写成 Color.CreateWithRedAndGreenAndBlueAndAlpha(255,255,255,255) 么。 你非要用其他语言的习惯来看ObjC,不怪有鬼了。
refresh
2013-10-08 17:38:59 +08:00
初用是很不习惯,用久了也蛮好的,只是有点冗长,但好处是可以不用看文档就能读代码,不好的地方是英文不好的人写出的代码可能会让你误解

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/84873

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX