Język Swift już niebawem w nowej odsłonie (5.4). Co zatem wprowadzi nowa wersja? Możemy się spodziewać oczywiście jak zawsze kolejnych ulepszeń w kompilacji – przyspieszenia procesu oraz dokładniejszego wskazania błędów w liniach zawierających niepoprawny kod.

Poprawka SE-0287 wspiera składnię wielokrotnie złożonych wyrażeń, zamiast dotychczasowego wspieranie prostych wyrażeń.

Dotychczas, żeby na przykład określić kolor napisu, można było użyć samej nazwy koloru tylko gdy był to jedyny parametr:

				
					Text("Ala ma kota")
     .foregroundColor(.green)
				
			

Aby dodać dodatkowa cechę, konieczne było dodanie nazwy nadrzędnej:

				
					Text("Ala ma kota")
     .foregroundColor(Color.green.opacity(0.5))
				
			

Od wersji 5.4 można opuścić ten element:

				
					Text("Ala ma kota")
     .foregroundColor(.green.opacity(0.5))
				
			

Kolejnym ulepszeniem jest wsparcie przeciążania funkcji lokalnych. Swift rozpoznaje, której funkcji użyć w zależności od użytych typów, natomiast od wprowadzenia poprawki SR-10069, a to działanie jest możliwe także dla funkcji, które są zagnieżdżone wewnątrz nadrzędnej funkcji.

Podobne ulepszenie dotyczy dekoratorów właściwości. Property wrappers od wersji Swift 5.4 mogą być stosowane  w funkcjach dla zmiennych lokalnych.

Poprawka SE-0284 rozszerza możliwości używania wielokrotnych parametrów wariadycznych dla funkcji czy inicjatorów – do tej pory możliwe było używanie tylko jednego parametru wariadycznego na raz.

Jako przykład można napisać funkcję która wyznaczy najlepszych uczniów i oceny  z danego przedmiotu w klasie, która akceptuje jeden parametr wariadyczny przechowujący nazwiska uczniów oraz drugi przechowujący oceny uczniów.

				
					func podajWyniki(uczniowie: String..., oceny: Int...) {
    let top5Uczniowie = Studenci.wybierzNajlepszych(lista: uczniowie)
    let top5Oceny = Studenci.wybierzNajlepsze(lista: oceny)

    print("Nasi najlepsi uczniowie to \(top5Uczniowie.joined(separator: ", "))")
    print("Najwyższe oceny to \(top5Oceny.joined(separator: ", "))")
}
				
			

Warunkiem poprawnego wywołania takiej funkcji jest etykietowanie wszystkich parametrów występujących po tych wariadycznych.

				
					podajWyniki(uczniowie: "Jan Kowalski", "Adam Wiśniewski", oceny: 6, 5, 6, 3, 2, 1)
				
			

Nad poprawką SE-0289 pracowano już od dłuższego czasu, jednak dopiero teraz oficjalnie weszła i przyniosła ze sobą nowy element języka @resultBuilder, który wypiera dotychczasowy @_functionBuilder. To rozwiązanie wspiera tworzenie widoków w SwiftUI, a dokładniej – pozwala grupować widoki w ramach jednego stosu VStack i przechowywać je wewnętrznie jako TupleView. Elementem @resultBuilder musi być metoda statyczna buildBlock(), która odpowiada za pobranie danych i przetworzenie ich – w poniższym przykładzie będzie to łączenie napisów.

				
					@resultBuilder
struct LaczenieNapisow {
    static func buildBlock(_ elements: String...) -> String {
        elements.joined(separator: "\n")	
    }
}

@LaczenieNapisow func polaczNapisy() -> String {
    "Litwo! Ojczyzno maja! Ty jesteś jak zdrowie,"
    "Ile cię trzeba cenić, ten tylko się dowie,", 
    "Kto cię stracił. Dziś piękność twą w całej ozdobie",
    "Widzę i opisuję, bo tęsknię po tobie" 
} 

				
			

Możliwości są tu ogromne – koniecznie trzeba zapoznać się z dokumentacją.