2014-08-27 107 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

相關問題