Jak już wyżej wspomniałem: nie można zmieniać wartości parametrów w ciele funkcji. Jeśli spróbujesz to zrobić, zostanie zgłoszony błąd.
Jeśli jednak koniecznie potrzebujesz zmienić wartość parametru, oznacz go jako: inout. Dodatkowo w momencie wywołania funkcji przed nazwą argumentu należy użyć: &.
Swift daje programiście do ręki typ danych o nazwie Optional, który służy do przechowania jakiejś wartości lub nic (nil). Ten typ można porównać do pudełka, które może coś posiadać lub będzie puste.
Jest to przydatne szczególnie wtedy, gdy nie jesteśmy pewni, czy do zmiennej przypisana zostania jakaś wartość.
Domyślną wartością dla Optional jest nil — co oznacza brak wartości.
Jeśli zmienna oznaczona jako Optional ma wartość, jest ona opakowana przez typ Optional.
Jak widać każda zmienna, która nie jest nil — która ma wartość, jest opakowana w Optional. Jak dostać się do tej wartości?
Jak pobrać wartość z Optional?
String i Optional (lub: String?) to dwa różne typy danych! Na Optional powinieneś patrzeć, jak na kontener, który może coś zawierać bądź nie (nil).
Dostęp do wartości Optional
Jeśli zmienna/stała przechowuje nil dostęp do niej łatwy. Żeby wyłuskać wartość z Optional, możesz napisać:
var a: String? = "Test 1"print(a!) // Test 1
Zauważ, że jeśli napiszesz:
var a: String? = "Test 1"print(a) // Optional<Test 1>
masz dostęp do Optional, które zawiera wartość.
Optional rozpakowany
Taki zapis:
var a: String! = "Test 1"print(a) // Test 1
sprawia, że Optional zostanie stworzony. Ale zauważ, żeby pobrać wartość, nie musisz już użyć !.
Z takim zapisem należy uważać:
var a: String!print(a.count)
W tym przypadku program się wysypie. Ponieważ a jest nil. Dlatego, zanim to użyjesz, warto mieć pewność, że zmienna posiada wartość.
Inny przykład:
var a: String!var b: String = a
W momencie przypisania a do b program także przestanie działać. Dzieje się tak dlatego, bo a jest nil. Przy próbie przypisania tego do b powoduje błąd. Próba przypisania nil do zmiennej, która nie jest Optional spowoduje błąd.
Jak poradzić sobie z takimi sytuacjami?
Czy Optional ma wartość?
Istnieje kilka sposób na sprawdzenie, czy Optional posiada wartość. Poniżej lista:
Instrukcja if
var a: String?if a != nil {
print(a)
}
Instrukcja if-let
var a: String?iflet tempA = a {
print(tempA)
}
Tutaj tworzona jest zmienna tymczasowa: tempA. Jeśli a nie jest nil do tempA przypisana jest wartość i warunek jest spełniony.
Instrukcja guard
var a: String?guard a {
return
}
print(a!)
Operator ??
var a: String?print(a ?? '')
Operator ?? spróbuje pobrać wartość z a. Jeśli jest to nil, zwróci to co podałeś po prawej stronie operatora. W tym przypadku pusty ciąg znaków.
Biblioteka React Testing Library daje programiście do ręki zestaw funkcji, które pozwalają na pobranie referencji do elementu w komponencie.
Te zapytania dzięlą się na trzy grupy:
getBy - Zapytanie zwraca referencję do elementu. Dodatkowo zostanie zasygnalizowany błąd w dwóch przypadkach: jeśli referencja nie została znaleziona lub zostało znalezionych więcej niż jeden element.
queryBy - Jeśli element nie został znaleziony zwróci null. To zapytanie jest przydatne kiedy potrzebujesz stestować przypadek, że dany element nie istnieje. Zasygnalizuje błąd jeśli zostało znalezionych więcej niż jeden element.
findBy - Zwraca Promise, która zawiera referencję do danego elementu. Promise zostanie odrzucona jeśli element nie został odnaleziony lub jeśli znalezionych zostało więcej niż jeden element po upływie 1000 milisekund (1 sekunda). Przydaje się więc w operacjach asynchronicznych.
Jeśli potrzebujesz pobrać więcej niż jeden element po danych kryteriach możesz użyć też: getAllBy, queryAllBy, findAllBy.
Przykłady
getByRole
Służy do pobrania referencji do elementu bazując na roli, jaką pełni element w dokumencie, w rozumieniu szeroko pojętej dostępności (ang.: accessibility). Na przykład czy jest to: przycisk, nagłówek, lista itp.
import {render, screen} from'@testing-library/react';
import {MyComponent} from"./MyComponent";
test('should field has default value', () => {
// givenconst { getByLabelText } = screen;
render(<MyComponent />);
const field = getByLabelText('Name');
// when - then
expect(field).toHaveValue('Default name');
});
getByDisplayValue
Jest podobne do getByLabelText różnica jest taka, że ta funkcja znajdzie Ci referencję, do elementu formularza na podstawie wartości, którą to pole zawiera.