2014-04-14 65 views
0

我剛開始學習Objective-C,我不確定何時使用點符號與方括號。我知道一個類似的問題已被問到here,但我仍然沒有真正理解其中的差異。我讀過[myObject doSomething]myObject.doSomething是等同的。但我不確定的是,當我使用@property生成一個方法時,它會自動生成一個setter方法,我只能使用方括號。錯誤「找不到屬性setVariableName」使用點符號設置屬性

// MyClass.h 

@interface MyClass : NSObject 
@property int number; 


// main.m 
MyClass *object = [[MyClass alloc] init]; 
[object setNumber:3]; 
object.setNumber = 4; // Property 'setNumber' not found 

爲什麼我收到錯誤消息,當我寫object.setNumber = 4,爲什麼我只能用方括號呢?

+1

使用'object.number = 4' –

+1

帶點表示法的等效語句是object.number = 4,而不是object.setNumber = 4.點表示法使用屬性本身的名稱,而不是使用setter的名稱。 – rdelmar

+2

只要您有一個採用0或1個參數的方法,就可以使用點表示法。你的代碼的問題是(爲什麼你會得到警告),你必須*不*在點表示法中使用'set'。這是爲什麼?編譯器從點符號生成常規方法調用。所以如果你寫'object.number = 4;'編譯器生成'[object setNumber:4];'。這就是爲什麼當你編寫'object.setNumber = 4;'時它不起作用,因爲編譯器生成了'[object setSetNumber:4];'而且這個方法不存在。 – HAS

回答

0

你會得到該錯誤,因爲該屬性被稱爲number而不是setNumber。在OOP語言中通常使用「setters」和「getters」來創建訪問對象數據的方法。 Objective-C 2.0中的一個屬性綜合了這個過程並自動生成了setter和getters。如果你進入MyClass.m並輸入- setN,你會看到Xcode建議的setNumber。這是因爲你可以自己實現你的setter和getters來定製它們的行爲,或者保留默認行爲,只需設置一個值或獲取一個值。

此外,屬性自動生成的變量聲明爲_variableName例如,你的財產的默認行爲是:

- (void) setNumber:(int)number { 
    _number = number 
} 

- (int) getNumber { 
    return _number; 
} 

確定是否應使用一個比其他真的可以歸結爲一致性。爲確保團隊的一致性,應制定一份風格指南。以NY Times爲例。它們將點符號嚴格限制爲非屬性方法的屬性和括號(即setter和getter)。

-1

你很混淆的方法和屬性。

當你創建一個屬性時,它會創建一個名爲setVARIABLE的setter方法。

調用方法的唯一方法是使用括號表示法。 IE [object setNumber:3];(除非你有0或1個參數,謝謝HAS)

你想要做的是使用屬性名稱,而不是setter(或getter)方法。

[object number]; 

這將返回數值的值。在通過括號表示法訪問它們時,您不能讀取屬性,它只是只讀的(只能訪問get函數)。

object.number = 3; 

這就是你將如何使用點符號設置的屬性號。

當你寫object.setNumber = 3;你正在處理setNumber就像一個屬性,它不是,這是一種方法。

總括來說

  1. 方法僅由括號符號可用,而不是點記號[object setNumber:3];(除非你有0或1參數)
  2. 通過括號符號[object number]; //returns the value of number訪問時,它只能讀取一個屬性
  3. 您可以讀取和寫入的屬性通過點符號使用時object.number = 3;
+1

您的「可變」術語已關閉。 '[object number]'是一個像'[object doThatThingYouDo]'一樣發送的消息'。這不是「讀變數」;一種方法正在運行;它的返回值可能是一個實例變量的值,但這不是固有的。 'object.number'也不能直接訪問變量。它又是一個語法糖,用於發送方法調用。 「調用方法的唯一方法是用括號表示法,因此IE'[object setNumber:3];'」因此不正確。 –

+0

答案錯了,請參閱我上面的評論。 – HAS

+0

對不起,沒有正確的術語。我更新了我的答案,以包含正確的術語。 –