Cześć.
Zacznijmy od podstaw. Budowa funkcji w Swift wygląda następująco.
func nazwa(etykieta_zewnetrzna etykieta_wewnetrzna: typ)
Etykieta zewnętrzna jest pokazywana przy wywoływaniu funkcji. Jest opcjonalna to znaczy, że możesz ją zamienić na znak podkreślenia `_`, który oznacza tyle, że coś jest bez nazwy. Aczkolwiek dobrym nawykiem będzie używanie etykiet zewnętrznych ze względu na poprawę czytelności kodu.
Etykieta wewnetrzna jest używana jako odwołanie do zmiennej w funkcji.
Oczywiście nawiasy klamrowe otwieramy zawsze po instrukcji w tej samej linii.
Powiedzmy, że masz napisać prostą funkcję tworzącej typ URL na podstawie jakiegoś stringa. Mógłbyś ją napisać tak.
func urlForString(_ string: String) -> URL {
...
}
wywołanie takiej funkcji i przypisanie do stałej będzie wyglądać następująco.
let url = urlForString(string)
Co nie jest jednak zbyt ładne, zwłaszcza, że jest to naprawdę prosta funkcja i ma jeden parametr, a może mieć ich więcej, a kod jednak powinien być maksymalnie czysty, zwłaszcza, że w programowaniu większość czasu się spędza na czytaniu kodu, więc tworząc kod, który jest przejrzysty i łatwy wczytaniu zaoszczędzamy sobie jak i innym(!) masę czasu.
Zamiana takiej funkcji na taką z etykietami zewnętrznymi będzie wyglądać, więc tak
func url(forString string: String) -> URL {
...
}
a wywołanie
let url = url(forString: string)
niektórzy by się jeszcze pokusili o taki zapis
func url(for string: String) -> URL {
...
}
wywołując tylko
let url = url(for: string)
Nie ma nic w tym złego, aczkolwiek zalecam używać już takiego zapisu, gdy mamy wiele takich funkcji co zwraca w tym wypadku URL, a przyjmować może wiele parametrów.
Nazwy funkcji oczywiście zapisujemy camel case'm.
Jedyna różnica w pisaniu funkcji jest przy delegete'ach.
Tam nazewnictwo funkcji trochę się różni.
Nazwa funkcji zawsze zaczyna nazwą klasy do której jest delegate, pierwszy parametr musi być zawsze typu tej klasy i zawsze dajemy go bez etykiety zewnętrznej.
Kolejne parametry już piszemy normalnie, ale tak żeby było wiadomo co ta funkcja robi.
np mamy klasę Action...
class Action {
weak var delegate: ActionDelegate?
var name: String
init(name: String) {
self.name = name
}
...
}
Tworzymy dla niej delegate'a, który informuje o zmianie nazwy, będzie to wyglądać tak.
protocol ActionDelegate {
func action(_ action: Action, didUpdateName name: String);
}
Oczywiście, będą też przypadki, że nie chcemy mówić, że jakaś zmienna się zmieniła, przekazywać ją tylko poinformować inny obiekt po prostu o tym, że coś się zmieniło, wtedy taki delegate tworzymy trochę inaczej dodając w nazwie funkcji co się stało czy obiekt został zaktualizowany czy coś dodał do jakieś tablicy itd.
np:
protocol ActionDelegate {
func actionDidChange(_ action: Action)
}
Jedna z ważniejszych rzeczy, którą powinienem na początku napisać to, że w nazwach funkcji używamy prostych czasów, nie używamy jakichś hasBeen czy innych tylko jakieś did, has, is itd
Tak po krótce to tyle jakby trzeba było to rozwinąć albo miałbyś pytania to śmiało pisz komentarz :-)