2009-07-01 20 views

Odpowiedz

29

Można napisać deklarację jako takie:

- (void) drawRoundedRect:(NSRect)aRect inView:(NSView *)aView withColor:(NSColor *)color fill:(BOOL)fill 

następnie zaproszenie (z 4 parametrów) mógłby wyglądać następująco:

[self drawRoundedRect:rect inView:self withColor:[NSColor greenColor] fill:YES]; 

gdzie rect jest wcześniej zdefiniowane NSRect, self jest NSView metoda jest wywoływana z obiektu NSColor uzyskanego z zagnieżdżonego wywołania metody i stałej wartości boolowskiej YES.

+0

to jest wiele metod, nie? – Devoted

+1

Nie. Wywołanie jest zawarte w jednym zbiorze [], więc musi to być jedna metoda. Jest to pojedyncza metoda z 4 parametrami. –

2

Jeff dokładnie opisał metody. Jeśli chcesz zobaczyć, jak to będzie wyglądać w funkcji C, to będzie wyglądać mniej więcej tak:

void drawRoundedRect_inView_withColor_fill(MyObject* self, SEL _cmd, NSRect aRect, NSView* aView, NSColor* color, BOOL fill); 

z „nazwami” parametrów Wszystkie łączą się tworząc pojedynczą nazwę metody, a dwa ukryte parametry, self i _cmd są dodawane z przodu.

14

W Objective-C nazwy metod są właściwie nazywane "selektorami" i mogą składać się z jednej lub więcej części. Jeśli metoda przyjmuje jeden lub więcej parametrów, z których każdy należy do wyboru jest w postaci:

selectorFragmentName:(ParameterType)parameterName 

Na przykład, widać zgłoszenia sposobu jak ten z NSColor:

+ (NSColor*) colorWithDeviceRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha; 

W tym przypadku , nazwa metody (selektora) to colorWithDeviceRed: green: blue: alpha: - reszta oznacza zakres (- na przykład metoda, + dla klasy), typ zwracany (NSColor * tutaj) oraz typ i nazwę każdego z nich. parametr.

KRYTYCZNA! W przeciwieństwie do większości innych języków, nie można przeciążać metod w Objective-C - oznacza to, że nie można mieć dwóch metod z tym samym selektorem, ale inną liczbą parametrów i/lub kolejnością typów. Na przykład, nie można mieć tych dwóch metod:

- (id) initWithObjects:(NSArray*)anArray; 
- (id) initWithObjects:(NSSet*)aSet; 

Ponieważ nazwa selektor dla obu jest initWithObjects: Objective-C nie rozróżnia tych dwóch. Nazwy selektorów są tłumaczone na unikalne liczby całkowite w celu bardzo szybkiego wyszukiwania, co jest korzystne w dynamicznym środowisku wykonawczym, ale rozczarowaniem dla osób oczekujących przeciążenia metod. Najczęstszym przypadkiem przeciążania w językach takich jak Java jest konstruktor, który nie jest problemem w Objective-C z powodu wzoru alloc/init. W przypadku innych metod wybór unikalnych nazw pozwala uniknąć problemu.

ze stylu punktu widzenia, ponieważ parametry są przeplatane w selektorze metody, programistów Objective-C (i Xcode) często wyrównać części długich selektorów w okrężnicy dla czytelności, zarówno dla deklaracji/definicji:

+ (NSColor*) colorWithDeviceRed:(CGFloat)red 
          green:(CGFloat)green 
          blue:(CGFloat)blue 
          alpha:(CGFloat)alpha; 

i inwokacja:

NSColor* myColor = [NSColor colorWithDeviceRed:0.5 
             green:0.6 
              blue:0.7 
             alpha:0.9]; 

spacja nie ma znaczenia dla kompilatora. Jeśli ułatwia czytanie i rozumienie, zdecydowanie go używaj.

+0

Wyjaśnienie pojęcia obiektu-c, nawet w porównaniu z JAVĄ, jest dla mnie naprawdę pomocne w zrozumieniu tego. Wspaniały post! – wao813

Powiązane problemy