Xcode 6.3 i Swift 1.2 - Co się zmieniło?
W cieniu tak znaczących wydarzeń, jak premiera Apple Watch, rozpoczęcie sprzedaży nowego MacBooka, aktualizacja iOS do wersji 8.3, OS X Yosemite do wersji 10.10.3 oraz iTunes do wersji 12.1.2, swoją premierę miał również Xcode 6.3, wspierający od teraz język Swift w wersji 1.2. Jakimi udogodnieniami uszczęśliwił deweloperów Apple w nowej wersji Xcode?
Do niedawna Xcode oznaczony cyferkami 6.3 dostępny był w wersji beta, wyłącznie dla zarejestrowanych deweloperów Apple. 8 kwietnia bieżącego roku, wraz z aktualizacjami systemów iOS i OSX doczekał się swojej finalnej wersji. Xcode w nowej odsłonie zawiera język Swift w wersji 1.2, SDK dla iOS 8.3 i OSX 10.10, WatchKit dla Apple Watch, symulator iOS oraz kompilator LLVM.
Swift 1.2
W najnowszej wersji Swift wprowadzono sporo zmian i udoskonaleń, oto kilka z nich:
Kompilacja przyrostowa - Pliki z kodem źródłowym, które nie uległy zmianie, od tej pory nie będą już każdorazowo rekompilowane. Wprowadzona zmiana znacznie przyspiesza pracę kompilatora przy dużych projektach, szczególnie z wykorzystaniem dodatkowych bibliotek.
Szybsze pliki wykonywalne - Podczas prezentacji języka Swift na WWDC 14 przedstawiciele Apple, jako największą jego zaletę wskazywali szybkość działania aplikacji zbudowanych za jego pomocą. Programiści, którzy pokusili się o przeprowadzenie testów wydajnościowych odkryli, że jest to raczej kit marketingowy. Nowa wersja ma to zmienić.
Konwerter kodu- Mechanizm konwertujący nasz projekt w języku Swift 1.1 do języka Swift 1.2, dostępny z menu Edit > Convert > To Lastest Swift Syntax.... Z moich doświadczeń wynika, że nie działa on niestety idealnie.
Nowa kolekcja
Set
. Wzorem Objective-C, w Swift 1.2 wprowadzono nowy typ kolekcji, będący zbiorem unikatowych elementów. Oto przykład użyciaSet
:var foodMenu = Set(["Pizza", "Naleśniki", "Bigos"]) //deklaracja zbioru foodMenu.insert("Pizza") //próba zdublowania elementu jest ignorowana foodMenu.insert("Schabowy") //dodanie nowego elementu foodMenu.remove("Pizza") //usunięcie elementu
W celu uporządkowania kodu, domyślna konwersja wartości z klas Objective-C
NSString
/NSArray
/NSDictionary
do ich odpowiedników w SwiftString
/Array
/Dictionary
stała się niemożliwa. Dla przykładu, deklarujemy dwa ciągi znakówNSString
iString
:
Nadpisanie zmiennej nsstring, za pomocą wartości zmiennej string nie sprawi problemu:var nsstring: NSString = "jakiś NSString" var string: String = "jakiś String"
Ale podobna operacja w drugą stronę wyrzuci nam błąd:nsstring = string // poprawny zapis
Aby skonwertować nstring do string musimy posłużyć się słowem kluczowymstring = nsstring // błąd
as
:string = nsstring as String // poprawny zapis
Możliwość używania wielu wyrażeń
if let
w jednej instrukcji warunkowej, za pomocą konstrukcjiif let
...where
. Na przykład:if let a = a, b = b, c = c where c != 0 { println("(a + b) / c = ((a + b) / c)") }
Stałe
let
nie muszą posiadać wartości na etapie deklaracji. Jedną z największych przeszkód w wykorzystaniu stałych w Swift była konieczność przypisywania im wartości już podczas ich deklaracji. W nowej wersji języka zrezygnowano z tego rygoru. Dla przykładu posłużymy się wariantową stałą przechowującą wartość dłuższej krawędzi obrazkaUIImage
:import UIKit let longEdge: CGFloat var image = UIImage(named: "obrazek.jpg")! if image.size.width > image.size.height { longEdge = image.size.width } else { longEdge = image.size.height }
Znaczące zmiany w rzutowaniu typu. Od tej pory słowo kluczowe
as
bez znaku interpunkcyjnego można stosować tylko do rzutowania w górę. W przypadku rzutowania w dół zastosowanie mają słowa kluczoweas?
lubas!
.Słowo kluczowe
as
używane jest do rzutowania (konwersji) wartości jednego typu (lub klasy) do innego typu. Dwie podstawowe formy rzutowania to rzutowanie w dół i rzutowanie w górę.Rzutowanie w górę (upcast) to konwersja wartości klasy pochodnej klasy do klasy bazowej. Na przykład, jeżeli klasa Dog jest klasą pochodną klasy Animal, rzutowanie w górę klasy Dog będzie wyglądać następująco:
let myDog: Dog = someDog() let myAnimal = myDog as Animal
Rzutowanie w górę sprawdzane jest na etapie kompilacji i jeżeli generowałoby jakiś błąd, kompilator nie pozwoli na uruchomienie aplikacji.
Rzutowanie w dół (downcast) to konwersja wartości klasy bazowej do klasy pochodnej. Na przykład, jeżeli klasa Dog jest klasą pochodną klasy Animal, rzutowanie w dół wartości klasy Animal do klasy Dog będzie wyglądać następująco:
let myAnimal: Animal = someAnimal() let myDog = myAnimal as! Dog
Jeżeli nie mamy pewności, że nasze zwierzę myAnimal (klasa bazowa Animal) to pies (klasa pochodna Dog) należałoby zastosować zapis ze słowem kluczowym
as?
:let myAnimal: Animal = someAnimal() let myDog = myAnimal as? Dog
Taki zapis pozawala przyjąć naszej klasie wartość
nil
w przypadku braku wskazanej klasy pochodnej. Możemy też skorzystać z mechanizmuif let
:if let myDog = myAnimal as? Dog { // mój zwierzak to pies! }
Xcode 6.3
Narzędzie Xcode 6.3 także otrzymało udoskonalenia i aktualizacje, m.in.:
- Dodano Crashes organizer - narzędzie do przeglądania i analizowania raportów z crashów generowanych przez nasze aplikacje w App Store lub TestFlight.
- Od tej pory Playground może zawierać dodatkowe zasoby, osadzone bezpośrednio w pliku .playgound (folder Resources dostępny poprzez użycie komendy Show Package Contents na pliku w którym zapisaliśmy nasz playground w Finderze).
- Ulepszono przejrzystość komentarzy w Playground poprzez umożliwienie korzystania ze składni markup.
- Wprowadzono wspieracie dla Force Touch trackpad w OSX SDK.
- Zaktualizowano Apple LLVM compiler, wprowadzając poprawioną diagnostykę oraz wsparcie dla C++'14.
- Wprowadzono również zmiany dotyczące podpisywania aplikacji napisanych z wykorzystaniem WatchKit.
Pełną listę zmian wprowadzonych w Xcode 6.3 i Swift 1.2 możecie znaleźć tu.
Xcode 6.4 beta
Niedługo po premierze Xcode 6.3, zgodnie oczekiwaniami deweloperów na ich kontach udostępniona została jeszcze nowsza wersja Xcode. Xcode 6.4 beta, bo o nim mowa pozwala budować i testować aplikacje dla systemu iOS 8.4 beta.