Jak napisać metodę/wiadomość z wieloma parametrami?Jak napisać metodę/wiadomość z wieloma parametrami?
EDYCJA: Tak jak wiele parametrów dla pojedynczej metody/wiadomości, mam na myśli.
Jak napisać metodę/wiadomość z wieloma parametrami?Jak napisać metodę/wiadomość z wieloma parametrami?
EDYCJA: Tak jak wiele parametrów dla pojedynczej metody/wiadomości, mam na myśli.
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
.
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.
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.
Wyjaśnienie pojęcia obiektu-c, nawet w porównaniu z JAVĄ, jest dla mnie naprawdę pomocne w zrozumieniu tego. Wspaniały post! – wao813
to jest wiele metod, nie? – Devoted
Nie. Wywołanie jest zawarte w jednym zbiorze [], więc musi to być jedna metoda. Jest to pojedyncza metoda z 4 parametrami. –