Co jest reprezentantem podkreślenia w odniesieniach Swift?

W sekcji reference w dokumentach Apple jest wiele przykładów tego typu rzeczy:

func runAction(_action: SKAction!)

Objective-C 'odpowiednikiem' tego jest:

- (void)runAction:(SKAction *)action

Wydaje mi się, że prawdopodobnie ważne jest, aby (w źródle Swift) była spacja po podkreśleniu, a "akcja" została napisana kursywą.

Ale nie mogę zrozumieć, co to próbuje przekazać. Więc być może pytanie brzmi:.. czy istnieje odniesienie do konwencji stosowanych w odniesieniach?

-- oto strona, do której odnoszę się w tym odwołaniu do użycia podkreślenia: https://developer.apple.com/documentation/spritekit/sknode#//apple_ref/occ/instm/SKNode/runAction

Update

Swift 3 wprowadził pewne zmiany w sposobie używania i nazwania nazw parametrów funkcji/metody oraz etykiet argumentów. Ma to wpływ na to pytanie i jego odpowiedź. @ Rickster czy niesamowita praca polega na odpowiadaniu na różne pytania dotyczące _underscores w funkcjach, które wyjaśniają wiele z tego, tutaj: Dlaczego potrzebuję podkreślenia w swift?

Author: Cœur, 2014-06-26

7 answers

Obie odpowiedzi były poprawne, ale chcę wyjaśnić trochę więcej.

_ jest używany do modyfikowania zachowania nazwy zewnętrznego parametru dla metod .

W lokalnych i zewnętrznych nazwach parametrów dla metod sekcja dokumentacji mówi:

Swift podaje nazwę pierwszego parametru w metodzie domyślną nazwę lokalnego parametru, a następnie podaje nazwy drugiego i kolejnych parametrów zarówno lokalnego, jak i zewnętrznego parametru nazwy domyślnie.

Z drugiej strony, funkcje domyślnie nie mają zewnętrznych nazw parametrów.

Na przykład mamy metodę foo() zdefiniowaną w klasie Bar:

class Bar{
    func foo(s1: String, s2: String) -> String {
        return s1 + s2;
    }
}

Kiedy wywołujesz foo(), nazywa się to jak bar.foo("Hello", s2: "World").

Ale , możesz nadpisać to zachowanie, używając {[2] } przed s2, gdzie jest zadeklarowane.

func foo(s1: String, _ s2: String) -> String{
    return s1 + s2;
}

Wtedy, gdy wywołujesz foo, może być po prostu wywołane tak, jak bar.foo("Hello", "World") bez nazwy drugiego parametr.

Wracając do twojego przypadku, runAction jest metodą, ponieważ jest związana z typem SKNode, oczywiście. Tak więc, umieszczenie _ przed parametrem action pozwala na wywołanie runAction bez zewnętrznej nazwy.

Aktualizacja dla Swift 2.0

Funkcja i metoda działają teraz w ten sam sposób pod względem lokalnej i zewnętrznej deklaracji nazw argumentów.

Funkcje są teraz wywoływane przy użyciu domyślnej nazwy zewnętrznego parametru, zaczynając od 2. parametru. To zasada dotyczy tylko czystego kodu Swift.

Tak więc, poprzez podanie _ przed funkcji , wywołujący nie będzie musiał podawać zewnętrznej nazwy parametru, tak samo jak w przypadku metody .

 116
Author: Aaron He,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-05 14:53:08

Podkreślenie jest ogólnym tokenem używanym do wskazania odrzuconej wartości.

W tym konkretnym przypadku oznacza to, że funkcja zostanie wywołana jako runAction(argument) zamiast runAction(action:argument)

W innych kontekstach ma inne podobne znaczenie, np. w:

for _ in 0..<5 { ... }

Oznacza to, że chcemy wykonać blok 5 razy i nie dbamy o indeks wewnątrz bloku.

W tym kontekście:

let (result, _) = someFunctionThatReturnsATuple()

Oznacza to, że nie obchodzi nas, jaki jest drugi element krotki, tylko pierwszy.

 85
Author: David Berry,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-22 05:59:54

Od Swift 3 wszystkie etykiety argumentów są wymagane przez domyślnie.

Można wymusić, aby IDE ukryło Etykietę argumentu za pomocą _.

func foo(a: String) {
}

func foo2(_ a: String) {
}

Nazwane foo(a: "abc") i foo2("abc")

Notatka: Może być używana tylko wtedy, gdy a jest (zewnętrzna) Etykieta argumentu i (Wewnętrzna) nazwa zmiennej w tym samym czasie. Jest równoważne - func foo(a a: String) nie akceptuje _.

Dlaczego Apple go używa?

Możesz zobacz, jak Apple używa go w interfejsie API. Biblioteki Apple są nadal napisane w Objective - C (jeśli nie, to i tak mają te same nazwy funkcji, które zostały zaprojektowane dla składni Objective - C)

Funkcje takie jak applicationWillResignActive(_ application: UIApplication)będą miały nadmiarową nazwę parametru application, ponieważ w nazwie funkcji znajduje się już Aplikacja.

Twój przykład

func runAction(_ action: SKAction!) nazywa się BEZ jest to _ znak jak runAction(action:). Nazwa parametru action byłoby zbędne ponieważ istnieje już jeden w nazwie funkcji. To jest cel i dlaczego tam jest.

 15
Author: Jakub Truhlář,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-06 16:22:36

Identyfikator przed deklaracją parametru definiuje zewnętrzną nazwę parametru. Jest to nazwa, którą musi podać wywołujący podczas wywoływania funkcji:

func someFunction(externalParameterName localParameterName: Int)

Swift zapewnia automatyczną nazwę zewnętrzną dla każdego domyślnego parametru, który zdefiniujesz, jeśli sam nie podasz nazwy zewnętrznej. Użycie podkreślenia dla nazwy zewnętrznego parametru jest wykluczone z tego zachowania:

Możesz zrezygnować z tego zachowania, pisząc podkreślenie (_) zamiast jawnej nazwy zewnętrznej podczas definiowania parametru.

Możesz przeczytać więcej o tym zachowaniu w sekcji zewnętrzne nazwy parametrów z wartościami domyślnymi tutaj .

 13
Author: Sergey Kalinichenko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-26 18:17:54

Myślę, że wymusza to konwencję w języku Swift, która sprawia, że czyta się ją bliżej objective-c, co lepiej pasuje do konwencji cocoa. W objc nie podajesz (zewnętrznie) pierwszego parametru. Zamiast tego, zgodnie z konwencją zazwyczaj umieszczasz zewnętrzną nazwę w drugiej części nazwy metody w następujący sposób:

- (void)myFancyMethodWithFirstName:(NSString *)aFirstName lastName:(NSString *)aLastName;

[someInstance myFancyMethodWithFirstName:@"John" lastName:@"Doe"];

Aby wywołania Swift API były zgodne z objc, będziesz chciał wyłączyć zewnętrzną nazwę parametru pierwszego param.

func myFancyMethodWithFirstName(_ firstName:String, lastName:String);

someInstance.myFancyMethodWithFirstName("John", lastName:"Doe")
 10
Author: smileBot,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-31 02:35:59

W rzeczywistości istnieje różnica między rzeczywistym kodem używanym do definiowania metody a deklaracją metody w dokumentach Apple. Weźmy UIControl ' s - addTarget:action:forcontrolevents: metoda na przykład, prawdziwy kod jest: Tutaj wpisz opis obrazka

Ale w dokumentach wygląda to tak (notice _ before target): Tutaj wpisz opis obrazka

W kodzie rzeczywistym, _ jest używane do tworzenia zewnętrznej nazwy drugiego lub kolejnego parametru nie pojawia się podczas wywoływania metody, podczas gdy W docs, _ przed lokalna nazwa parametru wskazuje, że podczas wywoływania metody lub funkcji nie należy podawać nazwy zewnętrznej.

Nie ma zewnętrznej nazwy, gdy funkcja jest wywoływana domyślnie, chyba że podasz własną lub dodasz # przed (bez spacji) lokalną nazwą parametru, na przykład w ten sposób używamy dispatch_after : Tutaj wpisz opis obrazka

A w dokumentach wygląda to tak (zauważ trzy _): Tutaj wpisz opis obrazka

Konwencja deklaracji funkcji jest taka sama jak ja opisane dla metody.

 5
Author: fujianjin6471,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-09 10:58:01

Tylko bardziej wizualnie.

Tutaj wpisz opis obrazka

Jak widać {[0] } wystarczy pominąć nazwę lokalnego parametru lub nie.

 1
Author: Nik Kov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-15 07:38:02