Objective-C中,点符号表示法和方括号表示法哪个更受青睐?

41

我正在阅读一本书 - Big Nerd Ranch iOS Programming。 它说点表示法不推荐使用,因为它会使代码变得难以理解。 同时,我正在观看斯坦福iOS编程课程,在其中他广泛使用点表示法。你会推荐什么?我个人更倾向于使用方括号表示法。

请说明如何将此代码转换为方括号表示法。

self.display.text = [self.display.text stringByAppendingString:digit];

据我理解,应该是这样的:

[[self display] setText]:[[[self display] text] stringByAppendingString:digit];

这是否正确?


1
这主要取决于个人喜好。 - omz
3个回答

66
这是个人选择的问题。有些人认为点号表示法不清楚,因为它和C语言的结构体成员访问非常相似,而实际上是在发送消息(调用方法)。另一方面,有人认为点号表示法更易于输入、阅读并更加简洁。
作为一个在点号表示法引入之前就开始编写 Objective-C 代码的人,我可以理解双方的争论,但我更喜欢使用点号表示法。尽管如此,我认为对于刚开始学习 Objective-C 的人来说,了解到点号表示法在编译时被转换为标准访问器方法调用是很重要的。我认为《Big Nerd Ranch》书的作者可能有着类似的态度,这也是他们决定在书中使用方括号表示法的主要原因之一。
所以总之,做你最喜欢的事情。两种方式都是有效的,选择其中之一基本上是一种风格问题。无论你选择哪种方式,请确保你了解这两种风格产生等效的编译代码。
编辑:我忘记回答关于将点号表示法转换为方括号表示法的问题。你接近正确,但你所写的是错误的,不能编译。应该是:[[self display] setText:[[[self display] text] stringByAppendingString:digit]]。如果是我,我会将其拆分成两行(实际上我会使用点号表示法):
NSString *stringWithDigit = [[[self display] text] stringByAppendingString:digit];
[[self display] setText:stringWithDigit];

编辑2:自从我回答这个问题已经过去了3年以上。我想指出的是,现在有更多的苹果框架类将以前的常规方法转换为属性(例如- [NSArray count] ),可能是为了更好地支持Swift。这导致我比以前更加自由地使用点符号表示法。


13
作为一个偶尔使用 Obj-C 的用户,我从不知道我可以用几个点取代一千万个括号。我一直以为它们大多数情况下是结构体访问。 - user7116
@Andrew Madsen,我引用的代码正确吗?那个括号的。 - Dvole
抱歉,我实际上没有回答你问题的那部分!我已经编辑了我的答案。 - Andrew Madsen
5
感谢您的答案,但我认为点表示法稍微不够表达性。在一瞬间的扫视中,人们无法分辨一行代码是在调用对象、设置属性还是使用KVO/KVC。 - isaac
@isaac,我有点同意你的看法。当使用点符号调用非属性访问器方法时,我真的不喜欢它,也从不以这种方式使用它。在KVO/KVC中使用时,键路径是字符串,并且周围的@""使它们足够容易区分(特别是使用语法着色)。 - Andrew Madsen
2
@AndrewMadsen +1 作为一个对在基于C的语言中使用方括号执行方法调用的想法感到非常厌恶的人,我尽可能使用点符号表示法。 - Sergey Kalinichenko

12

这是我的观点:

在处理属性时,您应始终使用点表示法。不仅编写起来更快(self.foo比[short foo]要短),而且更重要的是它使链接消息更容易理解。例如:

self.myTextField.text.length

[[[self myTextField] text] length]

更容易理解。

此外,使用点表示法还可以减少您出错的可能性(确保括号数目正确往往很麻烦)。

但正如其他人所述,最终这取决于个人意见。


16
有趣的是,在NSString中,length不是一个@property。 ;) - bbum
4
有趣的是,通常会使用链式属性的相同示例来指出方括号表示法可以更清晰地展示实际发生的情况。 - Munhitsu
2
同意,但我们必须找出哪个是属性,哪个是消息。 - onmyway133
9
有趣的是,现在 NSString 的长度可以通过 @property 访问 :) - Jakub Truhlář

6

我知道这是一篇旧文章,但我想添加一个更现代的答案。

随着Swift的发布和我们最喜爱的编程语言即将消亡,偏好应该倾向于使用点符号表示法。所有iOS框架已经更新其API,以支持点符号表示法(在头文件中更倾向于只读属性而不是获取器)。这使得最终转换到Swift更加流畅。

需要明确的是,对于需要暴露获取器和/或设置器的实例,请优先考虑使用属性。幸运的是,Xcode的现代Objective-C迁移工具可以为您完成大部分工作。


1
@Caleb,你是在建议我们忽略Swift,继续使用旧的、括号重的Objective C语法吗?尽管所有iOS框架都在向点属性过渡? - Daniel Galasko
不明白为什么你要费心“区分”你的代码。 - Daniel Galasko
1
我建议,在选择Objective-C风格时,Swift语法不需要考虑——通过使你的Obj-C代码看起来像Swift并不能获得任何优势。 - Caleb
幸运的是,从 Xcode 6 开始,现代化的 Objective-C 重构工具将为您完成此操作。http://useyourloaf.com/blog/xcode-6-objective-c-modernization.html - Daniel Galasko
正是 @Caleb,这就是为什么 [NSArray count] 现在是一个属性。因此,我的论点仍然成立,使用点符号表示法是有道理的。 - Daniel Galasko
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接