2014-08-27 108 views
-3

因此,我是iOS新手,并且注意到您不仅可以使用。符号但是有:(冒号)。和之间的区别。在Objective-C

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

谢谢你关于此事的任何和所有信息。

例子:

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

编辑:

我甚至看到了一些情况,其中“'被使用。那是什么意思? (我现在没有例子,如果我找到一个我会更新这篇文章)。

+1

请举例说明。 – 2014-08-27 18:15:38

+0

有人可以upvote我的问题,所以我不在负面,我试图建立我的声誉,所以我有机会获得更多的功能。但人们似乎不喜欢我的问题。 – CGTheLegend 2014-08-27 18:23:37

+0

@CGTheLegend:人们可能不喜欢你的问题,因为1)它的原始版本不好(没有提供足够的细节),2)这个问题已经在这里问过很多次了......如果你有这个问题,你会找到你的答案已经使用了搜索功能。如果你想建立声誉,可以在你的问题(和答案)上付出更多的努力。提供更多细节,举例,具体。 – DarkDust 2014-08-27 18:44:06

回答

2

附注::被称为冒号。分号是;。你的意思是冒号。

你遇到的东西叫做“点符号”,在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] 

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

+0

哈哈哈你说得对。那是冒号。我不知道为什么我把他们弄混了。谢谢,我会解决这个问题。 – CGTheLegend 2014-08-27 19:18:00

+0

这确实是信息。谢谢你。现在你能告诉我什么时候像':'。会发生? – CGTheLegend 2014-08-27 19:21:26

+0

我不知道那个':.'会是合法的ObjC。你遇到过吗? – 2014-08-27 19:22:40

0

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

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

为什么你需要第二个例子的额外括号?它也可以由self.layer代表吗? – CGTheLegend 2014-08-27 18:32:11

+0

你重写的例子不对,应该是:'[[self layer] setBorderColor:[[UIColor colorWithRed:0 green:0 blue:0 alpha:0.5] CGColor]]; – DarkDust 2014-08-27 18:49:48

+0

@DarkDust当然,我的坏。 – 2014-08-28 14:03:30

0

不,他们是不能互换:

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

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

所以,你的例子可以改写。 '。'的一个例子访问属性是当:

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中的所有基础知识,我建议从一开始阅读一本好书或学习它参考。

+0

我已经看过一些基础知识的资源,但我觉得我总是可以学到更多关于Objective-C的知识。你对一本好书有什么建议吗?我最好能有数字格式? – CGTheLegend 2014-08-27 18:27:35

+0

我不知道顶部有任何书籍。我建议查看亚马逊的Kindle部分,并查看具有很高评论分数的大量评论者的书籍。 – 2014-08-27 19:34:49

相关问题