2012-04-27 22 views
10

Obecnie uczę się programowania na obiektach C i iOS i utknąłem w niedziałającym kodzie z powodu tego subtelnego błędu przez godzinę. Rozważmy następujący kod:Pusta nazwa metody, co to właściwie robi?

@property (strong, nonatomic) NSString *name; 
- (NSString *):name { return @"Some name"; } 

na pierwszy rzut oka (i dla każdego nowego) to wygląda jak zastąpionej getter dla właściwości name. Ale tam jest bardzo subtelny, którego nie powinno tam być. Nie dostajesz ostrzeżenia/błędu z kompilatora/parsera/środowiska wykonawczego tutaj, więc moje pytanie brzmi: co to właściwie kończy się jako?

Próbowałem wymyślić sposób wywoływania tej metody, gdy zobaczyłem błąd, ale nie udało mi się wykonać kilku moich prób.

Odpowiedz

13

Podpis Sposób - (NSString *):name rozkłada się do następujących:

  • - Jest to przykład sposobu (w porównaniu do sposobu z klasy +).
  • (NSString *) Zwraca ciąg znaków.
  • : Jeśli miałbyś wymawiać nazwę tej metody, byłaby to po prostu nazwa "dwukropek". : mówi kompilatorowi, że twoja metoda akceptuje również jeden parametr.
  • name Istnieje parametr o nazwie nazwa.

Jeśli nie zostanie określony typ, kompilator zakłada, że ​​rozumie id, więc metoda ta rzeczywiście stanowi uzupełnienie się - (NSString *):(id)hello

Ważny wywołanie tej metody byłoby: [self :@"hello"].

Można robić naprawdę dziwne rzeczy, ponieważ : jest poprawną nazwą metody, a kompilator przyjmuje wartość id. Możesz, jeśli naprawdę chcesz, mieć metodę o nazwie - :::. Kompilator zakłada, że ​​chodziło o: - (id):(id):(id):(id), metodę, która zwraca obiekt typu id i pobiera trzy parametry typu id. Nazwałbyś to tak: [self :@"hello" :anObject :myObject];

+3

+1, po prostu dla 'Gdybyś wymawiał nazwę tej metody, można by ją nazwać ... dwukropkiem. – Perception

+0

Właściwie nazwa metody to "pusty ciąg znaków". Kiedy mówisz o nazwach metod, ogólnie nie mówisz o dwukropkach, nawet jeśli są tam ... mylące, wiem ... ale to jest trochę jak "," w języku angielskim. Przerwa lub złącze, ale nie mówione. – bbum

+0

@bbum W rzeczywistości Apple twierdzi, że oficjalnym sposobem na wypowiedzenie metody jest powiedzenie wszystkich dwukropków. Przeglądanie linii w dokumentach już teraz ... –

3

Metoda deklarowana jako opublikowana jest rzadka (i kiepski styl, imo). Objective-C ma być verbose. Metody rozbić tak:

  1. Pierwszy znak: Albo - lub +. - oznacza, że ​​jest to metoda instancji, + oznacza, że ​​jest to metoda klasy.
  2. Wartość w nawiasach: Rodzaj zwrotu metody. W twoim przykładzie metoda zwraca wartość (NSString *).
  3. Reszta (przed nawiasami klamrowymi) to nazwa metody wraz z parametrami, które biorą. Mógłbyś mieć nazwę bez parametrów, w takim przypadku nazwa metody nie miałaby w sobie nazwy :. Takich jak - (void) reload; Jest to metoda, która nie zwraca wartości i nie przyjmuje parametrów.
  4. Jeśli twoja metoda pobiera parametry, zostaną one wymieszane z nazwą metody i zwykle będą zadeklarować typ (w przeciwieństwie do twojego przykładu).Takich jak - (NSString *) reverseString:(NSString *) stringToReverse; W tym przykładzie twoja nazwa metody to reverseString: wymaga jednego parametru, NSString*, który zostanie nazwany stringToReverse w definicji metody.
  5. Zwykle, jeśli widzisz : bez typu, będzie to przypadek taki jak - (float) addThreeValues::: Ta metoda zwraca wartość zmiennoprzecinkową i pobiera 3 parametry. Byłaby to właściwa definicja, ponieważ trzy wartości nie mają znaczenia, w jakiej kolejności są one dostarczane, ponieważ właśnie je dodajemy.