Struktury pozwalają na organizację danych i dzięki temu łatwiejsze ich zarządzanie.
Składnia prezentuje się następująco:
structSomeStruct {
...
}
Żeby stworzyć strukturę, użyj słowa kluczowego struct, a następnie podajesz jej nazwę.
W ciele struktury określasz jej właściwości. Możesz też dodać do niej funkcje. W kontekście struktura funkcje nazywane są metodami.
structProduct {
var name: String=""var price: Float=0.0funcdescribe() {
print("Product name: \(name) and price is: \(price)")
}
}
Tworzenie instancji
Tworzenie instancji struktury wygląda tak:
var product =Product()
product.name ="Some product"
product.price =9.99
product.describe() // Product name: Some product and price is: 9.99
Można też określić wartości struktury w momencie jej tworzenia:
var product =Product(name: "Some product", price: 9.99)
product.describe() // Product name: Some product and price is: 9.99
Uwaga: ważna jest kolejność parametrów. Jeśli pierwszą właściwością w strukturze jest: A, a potem B podczas tworzenia instancji struktury musisz podać wartości, w takiej kolejności.
Czyli w przypadku Product nie możesz napisać tak:
var product =Product(price: 9.99, name: "Some product") // błąd!
Możesz do tworzenia instancji struktury także użyć metody init:
structProduct {
var name: Stringvar price: Floatinit(name: String, price: Float) {
self.name = name
self.price = price
}
funcdescribe() {
print("Product name: \(name) and price is: \(price)")
}
}
Dzięki tej metodzie sam możesz określić kolejność podawanych argumentów przy tworzeniu instancji struktury.
Metody
Jeśli potrzebujesz dodać do struktury metodę, która zmieni swój stan, nie możesz napisać tego w taki sposób:
structCart {
var products: [Product] = []
funcaddProduct(_product: Product) {
products.append(product)
}
}
var product =Product(name: "Some product", price: 19.99)
var cart =Cart()
cart.addProduct(product) // błąd!
Dlaczego? W Swift struktury są niezmienne ang.: immutable. Oznacza to, że z poziomu struktury nie możesz zmienić jej stanu. No nie do końca.
Wystarczy, że do danej metody dodasz słowo kluczowe mutating:
structCart {
var products: [Product] = []
mutatingfuncaddProduct(_product: Product) {
products.append(product)
}
}
var product =Product(name: "Some product", price: 19.99)
var cart =Cart()
cart.addProduct(product)
print(cart.products.count) // 1
Stałe struktury
Jeśli instancję struktury określisz za pomocą let:
let product =Product(name: "Some product", price: 19.99)
nie możesz napisać tak:
product.name ="Extra product"// błąd!
Za pomocą let mówisz Swift, że stan obiektu nie może się zmienić.
Na starcie przekazywana jest wartość do komponentu, która jest przypisana jest do kontrolki.
Żeby wprowadzić nową wartość, musimy kontrolkę wyczyścić. Robi się to za pomocą metody: clear z biblioteki: user-event. Jeśli zakomentujesz tę linijkę wartość kontrolki po wywołaniu metody: type będzie: "IwonaAdam".
Kiedy potrzebujesz stestować komponent, w którym zachodzą interakcje z użytkownikiem, warto napisać test, który zasymuluje cały proces, tak jakby robił to użytkownik. Możesz to zrobić za pomocą biblioteki user-event
Za pomocą getByLabelText i getByText pobieramy referencje do pola tekstowego i miejsca, gdzie tekst ma się wyświetlić po wpisaniu danych.
Za pomocą type z biblioteki user-event wprowadzany jest tekst do pola tekstowego. Pierwszy argument to referencja do kontrolki, dla której wpisujemy dane. Drugi argument to tekst, który chcemy przekazać.