【问题标题】:Difference between : and . in Objective-C: 和 之间的区别。在 Objective-C 中
【发布时间】:2014-08-27 18:08:27
【问题描述】:

所以我是 iOS 新手,并且注意到您不仅可以使用 .符号,但有:(冒号)。

我的问题是这两种符号有什么区别?他们的意思是什么?它们什么时候使用?它们可以互换吗?什么时候用哪个最好?

感谢您提供有关此问题的所有信息。

示例:

[self.layer setBorderColor:[UIColor blackColor].CGColor];
self.layer.borderColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.5].CGColor;

编辑:

我什至见过一些使用 ':.' 的例子。这意味着什么? (我现在没有例子,如果我找到一个我会更新这篇文章)。

【问题讨论】:

  • 请举例说明。
  • 有人可以支持我的问题,这样我就不会反对,我正在努力建立自己的声誉,以便获得更多功能。但人们似乎不喜欢我的问题。
  • @CGTheLegend:人们可能不喜欢你的问题,因为 1)它的原始版本很糟糕(没有提供足够的细节)和 2)这个问题在这里被问了很多次......你'如果您使用了搜索功能,d 已经找到了您的答案。如果您想建立声誉,请在您的问题(和答案)上投入更多精力。提供更多细节,举例,具体。
  • 我确实搜索了它,但没有找到我正在寻找的一般答案。可能我看的不够仔细。这并不是说我故意试图发布多余或缺乏的问题。但有时我没有意识到我不够清楚,直到有人要求我具体说明,有时当我最初写帖子问适当的问题时我不够清楚。我确实尝试使我的帖子尽可能有用,以便像我这样处于类似位置的其他人可以从中受益。

标签: ios objective-c syntax notation


【解决方案1】:

旁注,: 称为冒号。分号是;。你的意思是冒号。

您遇到的称为“点表示法”,在 Objective-C 中相对较新(如果我没记错的话,是 2007 年)。在当时,直到今天,由于它造成的混乱,它一直存在争议。

在 Objective-C 2.0 中添加点表示法之前,方括号表示法是调用方法的唯一方式,并且没有属性。所以你的例子应该是这样写的:

[[self layer] setBorderColor:[[UIColor blackColor] CGColor]];

这就是几十年来 ObjC 的编写方式。当 ObjC2 出现时,它为此添加了一个快捷方式,称为“点表示法”。

self.layer.borderColor = [[UIColor blackColor] CGColor];

理论上,点符号应该只用于属性。在实践中,编译器允许您在任何时候使用具有正确签名的方法。这是其争议的一部分。现在有多种语法可以做同样的事情,当你使用其中一种时,就会变得模糊不清。也就是说,点表示法非常流行,因为它略微减少了打字(坦率地说,因为它看起来有点像 Java,我怀疑这是它存在的原因)。

点表示法可能会造成混淆,因为它与结构表示法不明确。例如,您希望以下内容起作用:

self.frame.origin.x = 0.0;

不幸的是,self.frame 是使用点表示法的方法调用,但 frame.originorigin.x 是结构访问,它们完全不同,并且与点表示法不兼容(所以上面不会编译) .无法从代码中知道这一点;你只需要知道frame 是如何工作的。

不过,在大多数情况下,长话短说:

self.foo       <=> [self foo]
self.foo = bar <=> [self setFoo:bar]

编译器只是为了方便程序员将前者转换为后者。

【讨论】:

  • 哈哈哈你说得对。那是一个冒号。我不知道为什么我把他们搞混了。谢谢,我会解决的。
  • 这确实是信息。谢谢你。现在你能告诉我什么时候像':.'会发生吗?
  • 我不知道:. 会是合法的ObjC。你遇到过吗?
  • 没有任何实际代码,我只记得在一些示例代码示例中在线看到它,这让我感到困惑。如果我看到它出现,我会更新帖子。
【解决方案2】:

不,它们不可互换。 '.' 的一个例子是访问属性时:

myObj.someProperty = 10;

或者...

int someValue = myObj.someProperty;

在此示例中,您正在访问一个对象的属性,它是一个类的实例。

通过参数可以看到':'的例子:

[myObj someMethod:10 secondParam:20 thirdParam:40];

在本例中,参数的值跟在“:”之后。您不能执行以下操作:

[myObject someMethod.10 secondParam.20 thirdParam.40];

就像你不能说的那样:

myObj:someProperty;

这些都是 Objective-C 的基础知识,我建议从一开始就用一本好书或参考书来学习它。

【讨论】:

  • 我查看了一些基础资源,但我觉得我总能学到更多关于 Objective-C 的知识。你对一本好书有什么建议吗?最好有一个数字格式的?
  • 我不知道任何顶级书籍。我建议查看亚马逊的 Kindle 部分,并查看拥有大量评论者且评论分数也非常高的书籍。
【解决方案3】:

点表示属性,“:”只是方法调用中参数名称和值之间的分隔符。

BOOL b = control.isActive; // Getting property value
control.setIsActive = YES; // Setting property value

// The same using selectors:
BOOL b = [control isActive];
[control setIsActive:YES];

所以,你的例子可以改写为:

 [[self layer] setBorderColor:[[UIColor colorWithRed:0 green:0 blue:0 alpha:0.5] CGColor]];

【讨论】:

  • 为什么第二个例子需要额外的括号?也可以用self.layer来表示吗?
  • 你重写的例子错了,应该是:[[self layer] setBorderColor:[[UIColor colorWithRed:0 green:0 blue:0 alpha:0.5] CGColor]];
  • @DarkDust 当然,我的错。
猜你喜欢
  • 2012-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-28
  • 1970-01-01
  • 2010-12-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多