Objective-c点符号或方括号表示法中首选的是什么?

Dvo*_*ole 33 objective-c notation

我正在读一本书 - Big Nerd Ranch iOS编程.它说不建议使用点符号,因为它会混淆代码.我正在同时观看适用于iOS编程的斯坦福课程,并在其中广泛使用点符号.你会推荐什么?我个人更倾向于括号表示法.

您能解释一下如何将此代码转换为括号表示法吗?

self.display.text = [self.display.text stringByAppendingString:digit];
Run Code Online (Sandbox Code Playgroud)

据我所知,它应该是:

[[self display] setText]:[[[self display] text] stringByAppendingString:digit];
Run Code Online (Sandbox Code Playgroud)

这是对的吗?

And*_*sen 53

这是个人选择的问题.有些人认为点符号使得不清楚消息被发送(方法被调用),因为它看起来就像C风格的结构元素访问.论证的另一面是点符号更容易键入,更容易阅读,更简洁.

作为一个在编写点符号之前编写Objective-C的人(在Objective-C 2.0中),我可以理解双方的论点,但更喜欢自己使用点符号.也就是说,我认为对于从Objective-C开始的人来说,了解点编号语法在编译时转换为标准访问器方法调用非常重要.我认为Big Nerd Ranch书的作者可能也有类似的态度,这也是他们决定在书中使用括号表示法的重要原因.

简而言之,做你最喜欢的事.两者都是有效的,两者之间的选择基本上是一种风格问题.无论您选择哪种,请确保您了解这两种样式都会产生等效的编译代码.

编辑:我忘了回答关于将点表示法转换为括号语法的问题.你很亲密,但你写的是错的,实际上不会编译.它应该是:[[self display] setText:[[[self display] text] stringByAppendingString:digit]].如果我正在写它,我会把它分成两行(好吧,我真的用点符号):

NSString *stringWithDigit = [[[self display] text] stringByAppendingString:digit];
[[self display] setText:stringWithDigit];
Run Code Online (Sandbox Code Playgroud)

编辑2:我写这个答案已经超过3年了.我只是想注意,现在,更多的Apple框架类已经将以前常规方法转换为@properties(例如-[NSArray count])的东西推测为更好的Swift互操作.这让我比以前更加自由地使用点符号.

  • +1,作为一个偶然的Obj-C用户我不知道我可以用几个点替换1000万个括号.在大多数情况下,我假设它们是结构访问. (10认同)
  • 答案为+1,但imo dot符号的表达力稍差.在一瞬间,人们无法辨别一条线是在调用一个物体,设置一个属性,还是在KVO/KVC中摆弄. (4认同)
  • @AndrewMadsen +1作为一个彻底厌恶使用方括号来执行基于C语言的方法调用的想法,我尽可能使用点符号. (2认同)

Nos*_*tap 10

这是我的意见:

在处理属性时,应始终使用点表示法.不仅写入速度更快(self.foo比[short foo]更少的字符),更重要的是它使链接的消息更容易理解.例如:

self.myTextField.text.length

比起来更容易理解

[[[self myTextField] text] length]

此外,它使你不太可能搞乱标点符号(确保你有正确数量的括号通常是一个痛苦).

但是,正如其他人在上面所说,最终是个人意见.

  • 有趣的是,`length`不是`NSString`上的`@ property`.;) (15认同)
  • 有趣的是,长度是NSString上的@property现在:) (7认同)
  • 有趣的是,链式属性的相同示例通常用于指出括号表示法可以让您更好地了解实际发生的情况. (3认同)
  • 同意,但是我们必须找出实际上属于哪个属性,实际上是消息 (2认同)

Dan*_*sko 6

我知道这是一个老帖子,但我想补充一个更现代的答案.

随着swift的发布和我们最喜欢的语言即将消亡,偏好应该倾向于点符号.所有iOS框架都更新了它们的API以支持点表示法(更喜欢标题中的只读属性到getter).这使得最终的翻译变得更加流畅.

需要明确的是,首选属性来显示暴露getter和/或setter的实例.幸运的是,Xcode的现代objective-c迁移工具将为您完成大部分工作.