Jak mówili inni, jest to kwestia stylu pochodzącego z Objective-C.
Aby zrozumieć dlaczego ktoś chciałby tego stylu, należy rozważyć modyfikację swojej przykład:
func say(greeting: String) {
print("\(greeting)")
}
który można by nazwać tak:
say("Hello!")
Jeśli spojrzeć na nazwiska ty "Używam, prawdopodobnie brakuje niektórych informacji. Z funkcją o nazwie say()
, możesz rozsądnie myśleć, że jest to funkcja pozwalająca ci cokolwiek powiedzieć. Ale kiedy patrzysz na nazwę swojego parametru, jest całkiem jasne, że jest to funkcja do wypowiadania pozdrowienia, a nie do mówienia czegokolwiek.
Więc Objective-C woleliby, aby napisać to tak:
func sayGreeting(greeting: String) {
print("\(greeting)")
}
który można by nazwać tak:
sayGreeting("Hello!")
i to jest teraz jasne, że mówią na powitanie. Innymi słowy, sama nazwa funkcji lepiej opisuje to, co robisz. Z tego powodu, sayGreeting("Hello!")
jest lepszym rozwiązaniem niż say(greeting: "Hello!")
, ponieważ kluczowa rzecz, jaką pełni dana funkcja, powinna być opisana przez jej nazwę, a nie relegowana do nazwy parametru i mająca znaczenie drugorzędne.
Ale to uzasadnienie działa tylko dla pierwszego argumentu. Załóżmy, że chcesz dodać nazwę, tak jak to zrobiłeś. W języku jak C, gdzie masz żadnych zewnętrznych nazw parametrów w ogóle, można napisać:
void sayGreetingToName(char * greeting, char * person) { ...
i nazywają to lubią:
sayGreetingToName("Hello", "Dave");
która jest OK, ale zaczyna się rozpadają szybko, gdy masz przeładowany funkcji lub wartości domyślne, których nie masz w C. Jeśli chciałeś napisać:
func sayGreetingToName(greeting: String, name: String? = nil) {
if let name = name {
print("\(greeting), \(name)!")
}
else {
print("\(greeting)!")
}
}
następnie nazywając ją jako:
sayGreetingToName("Hello", "Dave")
wyglądałby w zasadzie OK, ale:
sayGreetingToName("Hello")
wygląda śmiesznie, bo nazwa funkcji mówi, że jesteś dostarczenie imię, ale nie jesteś.
Zamiast więc, jeśli napiszesz:
func sayGreeting(greeting: String, toName: String? = nil) {
if let name = toName {
print("\(greeting), \(name)!")
}
else {
print("\(greeting)!")
}
}
można nazwać to na dwa sposoby:
sayGreeting("Hello")
sayGreeting("Hello", toName: "Dave")
i wszystko wygląda zupełnie jasne.
Podsumowując, idea tego stylu pisania jest taka, że sama nazwa funkcji powinna zawierać wszelkie informacje zawarte w nazwie pierwszego parametru, ale nie ma sensu rozszerzać tego na kolejne parametry. Domyślnie pierwszy nie ma nazwy zewnętrznej, ale reszta nie. Funkcja polega na tym, że przez cały czas wypowiadane jest powitanie, więc powinno ono być wpisane w nazwę funkcji (a zatem nie powinno być powielane przez naciskanie na zewnętrzną nazwę pierwszego parametru), ale może, ale nie musi, o tym mówić. do konkretnej nazwy, aby informacje mogły być w nazwie funkcji nie być .
pozwala również na zasadzie odczytu wywołanie funkcji, jak gdyby był angielski, ponieważ nazwy i parametry są teraz mniej więcej w odpowiedniej kolejności, aby to zrobić:
sayGreeting("Hello", toName: "Dave")
Say (the) powitanie, "Hello", to (osoba z) imieniem "Dave"
Jest to całkiem fajny styl, kiedy już się przyzwyczaisz.
, więc pytasz, dlaczego twórcy tego języka zdecydowali się pójść w ten * sposób? – luk2302
Myślę, że nie jest spójny mieć pierwszy parametr bez nazwy zewnętrznej, a pozostałe parametry mają nazwy zewnętrzne, myślę, że powinny one lepiej mieć wszystkie parametry używać nazw zewnętrznych dla lepszej czytelności. Myślę, że lepiej zmienić ten projekt i mieć wszystkie parametry z zewnętrznymi nazwami. –