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?

Big 94e3961e 9b4e 401f a5d8 e6de60e77150

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życia Set:

    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 Swift String/Array/Dictionary stała się niemożliwa. Dla przykładu, deklarujemy dwa ciągi znaków NSString i String:

    var nsstring: NSString = "jakiś NSString"
    var string: String = "jakiś String"
    
    Nadpisanie zmiennej nsstring, za pomocą wartości zmiennej string nie sprawi problemu:
     nsstring = string // poprawny zapis
    Ale podobna operacja w drugą stronę wyrzuci nam błąd:
    string = nsstring // błąd 
    Aby skonwertować nstring do string musimy posłużyć się słowem kluczowym as:
    string = nsstring as String // poprawny zapis 

  • Możliwość używania wielu wyrażeń if let w jednej instrukcji warunkowej, za pomocą konstrukcji if 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 obrazka UIImage:

    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 kluczowe as? lub as!.

    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 mechanizmu if 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.

alt text

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.