2010-02-07 64 views
2

我正在查看此視頻的目標c。那傢伙表現出這需要多個參數的方法和它看起來像這樣方法採用點符號mutli參數

- (void) setTo: (int) n over: (int) d 
{ .... } 

使用它,他表示:

[myFraction setTo: 100 over:200]; 

如何將這項括號來看看在點noation? andi不明白 是什麼意思,有誰知道?日Thnx

回答

0

從外觀上來看,這種方法是設置兩個實例變量/對象的分子(n)和分母(d)的性質。你不能做到這一點使用點符號,除非你掰成兩個電話:

myFraction.numerator=100; 
myFraction.denominator=200; 

注意點記號僅用於訪問實例變量/屬性和不可替代消息發送。

+0

這是錯誤的!首先,點符號不能訪問實例變量,其次,它等同於消息發送:'myFraction.numerator = 100'與'[myFraction setNumerator:100]'完全相同。 – andyvn22 2010-02-07 15:38:59

+0

點語法僅用於訪問實例變量/屬性的訪問方法。不建議任何其他用途(儘管可能是這樣:請參閱Apple的「Objective-C編程語言」中的「點語法」下的「不正確使用」一節。也許我在原始答案中不夠清楚,但我是不是完全錯誤*,我認爲你可以使用更有禮貌的語氣...... – 2010-02-08 00:29:02

1

不能傳遞多個參數用點標記。由點符號中可用的制定者必須有原型

-(void)setXxxx:(type)value; 

但是,您可以創建一個輔助結構將所有參數到一個:

struct Fraction { int n, d; }; 
struct Fraction MakeFraction(int n, int d) { 
    struct Fraction r; 
    r.n = n; 
    r.d = d; 
    return r; 
} 
... 
-(void)setValue:(struct Fraction)f { ... } 
... 
myFraction.value = MakeFraction(100, 200); 

(和一個「過度」 b裝置一個/b。)

2

的點表示法是SH orthand表示只有財產訪問。編譯器將其轉換爲適當的setter/getter方法調用。它只是句法糖。

使用點符號因此,考慮該物業的訪問:

[myFraction setNumerator:100] 

現在應該很清楚爲什麼你不能使用點符號爲:

myFraction.numerator=100; 

編譯器與下面的等價代碼替換它發送正常的消息給對象。我什至不能想到如何看起來應該如何。

有很多關於點與括號標記正在進行討論。反對點符號的論據之一是它爲初學者產生的混亂。其他語言當然也使用屬性訪問器的方法,但是它們比Objective-C更加一致地隱藏了這個事實。

+0

我不確定你的意思是'@財產'意義上的屬性,還是更普通的意思,但請注意這個點符號在手寫訪問器中工作得很好(即使「@ property」從來沒有在.h中聲明過),而且我甚至會說如果你使用'myArray.count'這樣的點符號來表示它並不是很差的樣式 – andyvn22 2010-02-07 15:57:14

0

在Objective-C,我們可以說出與在中間參數的方法。所以當他寫道[myFraction setTo:100 over:200];時,over可能意味着......無論他想要什麼。這是他選擇的方法名稱的一部分。在這種情況下,他可能試圖讓方法聽起來像英語。 (「設置這部分以100比200」我們讀的部分爲「分子超過分母」往往在正常講話。)

一些被稱爲「訪問器」的方法,我們寫得非常頻繁:這些方法的形式爲- (int)variable(稱爲「getters」)和- (void)setVariable:(int)newValue(稱爲「setters」)。我的例子在這裏假設會分別返回或改變一個名爲variable的實例變量。這裏的方法的實現可能是什麼樣子:

- (int)variable 
{ 
    return variable; 
} 

- (void)setVariable:(int)newValue 
{ 
    variable = newValue; 
} 

這是常見的有這樣的存取,幾乎每一個實例變量的類有。在某些時候,有人厭倦了寫作[myInstance setVariable:20];等,並決定他們寧願它看起來像其他許多語言,myInstance.variable = 20;

因此,增加的Objective-C 2.0點符號,它允許你寫的...

myInstance.variable,這是完全等同於在大多數情況下[myInstance variable](並且不直接訪問實例變量variable!),和...

特殊情況myInstance.variable = 20;,這完全等同於[myInstance setVariable:20];。再次請注意,這不直接訪問variable,它會向myInstance發送消息。所以如果我們在setVariable中寫了一些其他代碼,如果我們使用點符號,它仍然會被訪問。

點符號旨在用於訪問器。您理論上也可以將它用於返回值並且不帶任何參數的任何方法(例如,myArray.count)。用於其他任何東西(myInstance.doSomeAction)是極端差的風格。不要這樣做。因此,我相信你現在可以猜到,[myFraction setTo:100 over:200]沒有點符號的等價性,因爲它需要2個參數,而不是一個存取器。

+0

我來自php背景,過去我學過很多其他的語言,當我看到目標ci中的一種方法時,可以將它與php中的函數進行比較,或者我可以從過去學習c的方式來回憶它。可以這樣做 - (void)setTo:(int)n over:(int)d在像c這樣的語言中進行比較void function setTo(in t n,int d){}結束於何處:進來? – sarmenhbbb 2010-02-07 17:10:36

+0

'over:'是方法名稱的一部分。'setTo(int n,int d)'不是一個好的類似C函數。 'setTo_over_(int n,int d)'更好。該方法的全名不是'setTo',而是'setTo:over:'。爭論恰好在方法的中間。 – andyvn22 2010-02-07 19:12:42

0
[myFraction numerator] 

可以寫成

myFraction.numerator 

,但你也可以將這些值作爲

instance.property = value 

但你不能用點表示多個參數傳遞。