何时使用括号以及何时使用Objective-C中的句点

Jam*_*ght 15 objective-c

我是一名新的iPhone/Objective-C开发人员,因为我正在阅读不同的教程和开源代码,我在理解何时使用方括号"[]"以及何时使用句点时遇到一些问题"."用于访问对象的属性/方法.

例如,这段代码:

- (void)setSelected:(BOOL)selected animated:(BOOL)animated {

  [super setSelected:selected animated:animated];

  UIColor *backgroundColor = nil;
  if (selected){
    backgroundColor = [UIColor clearColor];
  } else {
    backgroundColor = [UIColor whiteColor];
  }

  self.todoTextLabel.backgroundColor = backgroundColor;
  self.todoTextLabel.highlighted = selected;
  self.todoTextLabel.opaque = !selected;

  self.todoPriorityLabel.backgroundColor = backgroundColor;
  self.todoPriorityLabel.highlighted = selected;
  self.todoPriorityLabel.opaque = !selected;
}
Run Code Online (Sandbox Code Playgroud)

为什么[UIColor clearColor]得到括号,但todoTextLabel.backgroundColor得到句号?

有人能为我轻松解释一下吗?

Jed*_*ith 28

我在新代码中看到的约定是使用点作为属性,并且总是使用方括号作为消息/选择器(你称之为方法).该点是在Objective-C 2.0中引入的,因此您在网上找到的信息的分歧并非完全出乎意料.

它仍然完全可以使用方括号,仍然(我做):

foo = [myObject backgroundColor];
[myObject setBackgroundColor:foo];
Run Code Online (Sandbox Code Playgroud)

相当于

foo = myObject.backgroundColor;
myObject.backgroundColor = foo;
Run Code Online (Sandbox Code Playgroud)

重申一下,您不应该使用点作为消息,仅使用属性.

要回答您的具体问题,请[UIColor clearColor]使用括号,因为它不是属性; 它实际上是UIColor(+(UIColor)clearColor)的类消息.

你听起来像是来自Java世界,所以这可能会有所帮助:

MyObject *foo = [[MyObject alloc] initWithAwesome:YES];    /* MyObject foo = new MyObject(TRUE); */
[foo doSomethingWithNumber:5 andString:"five"];            /* foo.doSomething(5, "five"); */
MyColor *bar = foo.faceColor;                              /* MyColor bar = foo.faceColor; */
MyColor *baz = [foo faceColor];                            /* MyColor baz = foo.faceColor; */
foo.backColor = bar;                                       /* foo.backColor = bar; */
[foo setUndersideColor:baz];                               /* foo.undersideColor = baz; */
Run Code Online (Sandbox Code Playgroud)

"setXXX"和"XXX"消息来自合成的动态属性,是Objective-C的习语."点"只是调用这些方法的简写,大致相当.

编辑:现在我有一些赞成,时间让你们有些人重新考虑> :)

我从不使用圆点,也不应该使用圆点.


nal*_*all 5

Big Nerd Ranch关于点符号的一些想法值得一读。

也有反驳


reb*_*ebo 5

我使用点符号表示属性,因为,

for ( Person *person in group.people){ ... }
Run Code Online (Sandbox Code Playgroud)

比阅读更容易阅读

for ( Person *person in [group  people]){ ... }
Run Code Online (Sandbox Code Playgroud)

在第二种情况下,通过将您的大脑置于消息发送模式来中断可读性,而在第一种情况下,很明显您正在访问组对象的people属性.

我也会在修改集合时使用它,例如:

[group.people addObject:anotherPerson];
Run Code Online (Sandbox Code Playgroud)

比...更具可读性

[[group people] addObject:anotherPerson];
Run Code Online (Sandbox Code Playgroud)

在这种情况下的重点应该是将对象添加到数组而不是链接两个消息.