Sobes.tech
Junior

Jakie są niuanse pracy z tablicami podczas dodawania do nich danych?

sobes.tech AI

Odpowiedź od AI

Podczas dodawania elementów do tablic w Swift, należy wziąć pod uwagę:

  • Mutowalność: Tablice zadeklarowane za pomocą var są mutowalne i pozwalają na dodawanie, usuwanie i modyfikowanie elementów. Tablice zadeklarowane za pomocą let są niemutowalne i po inicjalizacji nie można zmieniać ich zawartości.

    let tablicaNiemutowalna = [1, 2, 3]
    // tablicaNiemutowalna.append(4) // Błąd kompilacji
    
    var tablicaMutowalna = [1, 2, 3]
    tablicaMutowalna.append(4) // Działa
    
  • Wydajność: Dodawanie elementów na koniec tablicy (append) jest zazwyczaj efektywne, ponieważ w większości przypadków dostępne jest wolne miejsce w przydzielonej pamięci. Jednak, jeśli tablica się zapełni, następuje przerezerwacja pamięci, co może być kosztowne i wpływać na wydajność, szczególnie przy częstych dodaniach. Dodawanie elementów na początku lub w środku (insert) wymaga przesunięcia istniejących elementów, co ma złożoność O(n) (gdzie n to liczba elementów po punkcie wstawienia).

  • Typ elementów: Tablice są jednorodne. Próba dodania elementu innego typu spowoduje błąd kompilacji.

    var tablicaLiczbCalkowitych = [1, 2, 3]
    // tablicaLiczbCalkowitych.append("cześć") // Błąd kompilacji
    
  • Dodawanie wielu elementów: Metody takie jak append(contentsOf:) pozwalają na dodanie zawartości innej tablicy lub sekwencji, co może być bardziej wydajne niż sekwencyjne dodawanie pojedynczych elementów.

    var tablica1 = [1, 2]
    let tablica2 = [3, 4]
    tablica1.append(contentsOf: tablica2) // teraz tablica1 to [1, 2, 3, 4]
    
  • Przepełnienie przy dodawaniu (Int/UInt): Przy pracy z tablicami typów całkowitych (Int, UInt), należy pamiętać o możliwości przepełnienia podczas operacji arytmetycznych na indeksach lub wartościach, jeśli jest to istotne dla logiki dodawania.

  • Indeksacja: Przy używaniu wstawiania po indeksie (insert(_:at:)) należy upewnić się, że indeks mieści się w zakresie 0...count. Użycie indeksu spoza tego zakresu spowoduje błąd w czasie wykonywania (crash).

  • Rezerwacja pojemności: Jeśli znana jest przybliżona lub dokładna maksymalna pojemność tablicy, można zarezerwować pamięć z wyprzedzeniem za pomocą reserveCapacity(). Może to poprawić wydajność, unikając wielokrotnych przerezerwacji pamięci.

    var wydajnaTablica = [Int]()
    wydajnaTablica.reserveCapacity(100) // Rezerwacja miejsca na do 100 elementów
    for i in 1...100 {
        wydajnaTablica.append(i) // Operacje dodawania będą szybsze
    }