SWIFT Aplikacje Mobilne i Multimedialne
Swift (pol. jerzyk) nowy język programowania zaprezentowany latem 2014 r. (prace od 2010 r.) przeznaczony do programowania zarówno pod ios jak i Mac OS X bazuje na logice Objective-C bez kompatybilności z C
Podobieństwa do Objective-C typy podstawowe operatory użycie nawiasów klamrowych {} użycie nawiasów kwadratowych [] (tablice) operator przypisania =, porównania == podobne instrukcje (pętle, warunkowe) dziedziczenie metod klas i instancji słowo kluczowe self
Różnice vs Objective-C nie trzeba używać ; brak plików nagłówkowych silne typowanie przeciążanie operatorów nowy operator === porównujący obiekty pełne wsparcie Unicode w string brak obsługi wyjątków inferencja typów programowanie generyczne typy funkcyjne
Różnice vs Objective-C domyślnie nie ma wskaźników przypisanie nie zwraca wartości brak konieczności używania break w instrukcji switch (instrukcja fallthrough) zmienne i stałe są zawsze inicjalizowane przepełnienie zakresu jest wykrywane, chyba, że użyjemy specjalnych operatorów, np. &+, &-
Playground xcode 6 zawiera moduł Playground służy on do sprawdzania na żywo jak działa kod Swift
Playground Można na różne sposoby wizualizować działanie kodu
Playground Można korzystać z większości API, np. UIKit
Zmienne i stałe Słowa kluczowe let i var let definiuje stałą var definiuje zmienną podstawienie wartości określa typ zmiennej/stałej dzięki inferencji typów
Zmienne i stałe Nazwy zmiennych mogą zawierać dowolne znaki Unicode oprócz: spacji symboli matematycznych linii i prostokątów Nie mogą się zaczynać od cyfry
Typy podstawowe Int8 UInt8 Int (Int32, Int64) UInt (UInt32, UInt64) Double (64 bity - 15 cyfr) Float (32 bity - 6 cyfr) String Bool (true lub false)
Typy podstawowe Dla których ma to sens mają własności max i min Można stosować aliasy nazw typów
Operatory Podstawowe operatory: +,-,*,/,% (modulo) Operatory złożone: +=, -=, *=, /=, %=, &&, Operatory inkrementacyjne: ++, Operatory porównania: ==, >, <, >=, <=,!= Operatory zakresu: x..y, x..<y Operatory bitowe: &,, ^, <<, >>, &=, =, ^=, <<=, >>=
Operatory typów Operator is sprawdza, czy obiekt jest danego typu i ma wartość boolowską Operator as? rzutuje obiekt na typ opcjonalny, a gdy jest to niemożliwe podstawia nil Operator as! wymusza rzutowanie na typ, a jeżeli jest niemożliwe to występuje błąd wykonania Operator as można stosować przy rzutowaniu w górę
Zmienne i stałe wartości nigdy nie są domyślnie konwertowane do innych typów - trzeba stworzyć nową wartość wartości w stringach można osadzać łatwiej typy opcjonalne (nullowe) - dodajemy? wtedy zmienna może mieć wartość nil
Tablice i słowniki Deklaruje się je za pomocą nawiasów kwadratowych Dostęp do elementów też przez nawiasy Słowniki klucz:wartość Aby utworzyć puste korzystamy ze składni konstruktorów
Krotki Wartości można grupować w krotki (tuples) Krotka może zawierać dowolną kombinację typów Krotkę można zdekomponować na składowe
Krotki niepotrzebne wartości można zastąpić podkreśleniem do składowych można się odwołać przez indeks
Krotki składowe mogą mieć swoje etykiety
Instrukcje instrukcje warunkowe if i switch warunek musi być zawsze boolowski pętle for-in, for, while, do-while
Instrukcja warunkowa Jeżeli chcemy sprawdzić, czy zmienna ma wartość w instrukcji warunkowej można wykorzystać operator let
Instrukcja switch Nie jest ograniczona do typów prostych Nie jest ograniczona do równości Musi być wyczerpująca - klauzula default
Instrukcja switch W przeciwieństwie do innych języków Swift automatycznie kończy switch po znalezieniu pasującego przypadku Można użyć break, gdy tego potrzeba Można to zmienić instrukcją fallthrough
Instrukcja for-in Umożliwia iterowanie po tablicach i słownikach
Pętle while, do-while for..<
Pętle przerwanie pętli - break zakończenie bieżącego przebiegu - continue
Funkcje Do deklaracji funkcji służy słowo kluczowe func Argumenty oddzielone przecinkami, poprzedzone etykietami i dwukropkiem Typ funkcji po argumentach oddzielony ->
Funkcje Argumenty funkcji mogą mieć etykiety Trzeba z nich wtedy korzystać w trakcie wywołania Argumenty mogą mieć wartości domyślne
Funkcje Funkcja może mieć wiele wartości, identyfikowanych przez etykiety lub indeks
Funkcje Liczba argumentów funkcji może być zmienna pod warunkiem, że są tego samego typu
Funkcje Domyślnie argumenty są przekazywane jako stałe - nie można ich modyfikować Można to zmienić deklarując argument jako zmienną Nie zmienia to wartości poza funkcją
Funkcje Argumenty wyjściowe można uzyskać przez słowo kluczowe inout Przekazywany argument musi być wtedy poprzedzony &
Funkcje zagnieżdżone Funkcje mogą się zagnieżdżać Funkcja zagnieżdżona ma dostęp do zmiennych funkcji zewnętrznej
Funkcje są typem pierwszej klasy Funkcja może być traktowana jak inne typy Funkcje mogą przekazywać funkcję i być przekazywane jako argument
Funkcje i domknięcia Funkcje są szczególnymi przypadkami domknięć (closure) Domknięcia to segmenty kodu, które mogą być wywoływane wielokrotnie Domknięcie jest tworzone pomiędzy nawiasami klamrowymi { } wersja uproszczona
Obiekty i klasy Klasa jest deklarowana słowem kluczowym class Wszystko zdefiniowane wewnątrz klasy jest jej elementem składowym (pola, metody, własności)
Konstruktor klasy Metoda zaczynająca się od init, nie posiadająca typu Jeżeli obiekt jest kosztowny może posiadać destruktor deinit
Dziedziczenie Tylko pojedyncze Składnia jak w C++/C# - klasa nadrzędna po :
Przeciążanie metod Własności Tylko ze słowem kluczowym override Własności mogą mieć getter i setter klasa nadrzędna nowa wartość
Własności Jeżeli własność nie wymaga obliczania, ale wymaga sprawdzenia przed lub po zmianie, można wykorzystać sekcje willset i didset
Typy wyliczeniowe Deklarowane przez słowo kluczowe enum typ bazowy Typem bazowym może być Int, String lub typy zmiennoprzecinkowe
Typy wyliczeniowe Zmienną wyliczeniową można utworzyć z typu bazowego Typ wyliczeniowy może nie mieć typu bazowego
Typy wyliczeniowe składowe typu wyliczeniowego mogą mieć skojarzone ze sobą wartości mogą się one różnić w ramach jednego typu
Struktury Są podobne do klas Przekazywane zawsze przez wartość (klasy przez referencję) Słowo kluczowe struct
Protokoły metoda będzie zmieniać obiekt Odpowiednik interfejsów Słowo kluczowe protocol Mogą być adaptowane (implementowane) przez klasy struktury i wyliczenia
Protokoły Protokoły mogą być używane jak każdy inny typ
Rozszerzenia Dodawanie nowej funkcjonalności do istniejących klas Słowo kluczowe extension
Typy generyczne Podobnie jak w innych językach deklarowane za pomocą < > Generyczne mogą być funkcje, metody, klasy, typy wyliczeniowe i struktury
Typy generyczne Typ generyczny może stawiać wymagania, np. co do realizacji protokołów z użyciem słowa kluczowego where
Pierwsza aplikacja
Pierwsza aplikacja Prosty konwerter wartości ze stopni Celsjusza na Fahrenheita Szablon Single View Application
Konwerter Otwieramy scenorys Dodajemy pole tekstowe, guzik i etykietkę
Konwerter Ustawienia Auto Layout
Klasa AppDelegate
Klasa ViewController
Konwerter Tworzymy gniazdka
Konwerter Uzupełniamy metodę Dodajemy chowanie klawiatury
Konwerter
TouchID
TouchID Wykorzystywane do potwierdzania tożsamości za pomocą czytnika linii papilarnych Dane dotyczące skanów są poufne Dostępne na iphone 5s, 6, 6+, ipad Air 2, ipad mini 3 Może nie być skonfigurowane na urządzeniu
TouchID Nowy projekt z szablonu Single View
TouchID Dodajemy bilbiotekę
TouchID W scenorysie dodajemy przycisk na środku ekranu
TouchID Dodajemy wyrównanie do środka ekranu
TouchID Dodajemy akcję testtouchid
TouchID Dodajemy import biblioteki LocalAuthentication Dopisujemy metodę notifyuser
TouchID Sprawdzamy, czy urządzenie wspiera TouchID
TouchID Dopisujemy kod autoryzacji
TouchID Emulator nie obsługuje TouchID
SpriteKit
SpriteKit Biblioteka do tworzenia gier wbudowana w SDK Wspiera grafikę 2D w oparciu o sprite y
SpriteKit HelloWorld
SpriteKit HelloWorld
SpriteKit AppDelegate identyczny jak w innych szablonach Korzysta z mechanizmu scen (poziomy/ekrany) scena ma swoją klasę GameScene.swift i plik z projektem GameScene.sks kontroler klasy widoku ładujący scenę GameViewController.swift scenorys z projektem UI sprite znajduje się w Images.xcassets
SpriteKit - scenorys
SpriteKit - kontroler widoku
SpriteKit - kontroler widoku
SpriteKit - scena
Przerabiamy szablon Zmieniamy orientację ekranu na poziomą Wyrzucamy projekt sceny GameScene.sks Zmieniamy GameViewController.swift
Kontroler widoku
Sprite Dodajemy zasoby do projektu Edytujemy GameScene.swift Pokazujemy na ekranie naszego bohatera
Efekt
Dodajemy przeciwników Dodajemy metody do GameScene.swift
Dodajemy przeciwników Modyfikujemy metodę didmovetoview
Efekt
Strzelanie nasz bohater będzie strzelał w kierunku miejsca, w które stuknie gracz potrzebujemy do tego trochę matematyki SpriteKit niestety nie udostępnia funkcji operujących na wektorach i macierzach
Operatory wektorowe Dodajemy je przed klasą GameScene
Dotyk Dodajemy obsługę dotyku w klasie GameScene
Efekt
Wykrywanie kolizji SpriteKit zawiera obsługę fizyki, która znacząco ułatwi wykrywanie kolizji sprite y mogą należeć do jednej z 32 kategorii zdefiniujemy sobie strukturę
Wykrywanie kolizji nasz klasa będzie informowana o zdarzeniach fizycznych, gdy będzie realizować protokół SKPhysicsContactDelegate w metodzie didmovetoview dodajemy
Wykrywanie kolizji w metodzie addmonster dopisujemy kod po utworzeniu potwora 1.przypisujemy potworowi jego pole 2.potwór będzie poruszany przez nas, a nie przez fizykę 3.ustawiamy kategorię sprite a 4.ustawiamy kategorię sprite ów, dla których ma być wykrywana kolizja 5.tu by można ustawić np. odbijanie się obiektów
Wykrywanie kolizji Podobny kod dopisujemy w touchesended dla pocisków Dodajemy metodę obsługującą kolizję
Wykrywanie kolizji Dodajemy metodę wymaganą przez protokół
Efekt
Dźwięk SpriteKit nie ma dedykowanego mechanizmu do obsługi dźwięku Dźwięk można odtwarzać korzystając z normalnego API
Dźwięk Przed klasą GameScene dodajemy kod
Dźwięk Na początku metody didmovetoview dodajemy a na początku touchesended to
Efekt
Ekran GameOver Dodajemy nowy plik swift GameOverScene.swift Edytujemy kod
Warunek końca Gdy potwór nas ominie przegrywamy Zamieniamy ostatnią linię w metodzie addmonster na
Efekt
Wygrana Wygrywamy, gdy zabijemy 30 potworów Dodajemy pole w klasie GameScen modyfikujemy metodę didcolidewithmonster
Efekt
SceneKit
SceneKit podobna biblioteka do SpriteKit tyle, że do grafiki 3D
SceneKit Scenorys - obiekt GameViewController
SceneKit
SceneKit - kontroler widoku
SceneKit - kontroler widoku
SceneKit - kontroler widoku
Przykładowa aplikacja
Przykładowa aplikacja program do wizualizacji cząsteczek w 3D
Scenorys Na widok składa się etykietka, pole wyboru i SceneKit View
SceneKit operuje na hierarchicznej strukturze węzłów każda transformacja dotyczy węzła i jego dzieci
Przykładowa aplikacja Początkowy ViewController
Tworzenie sceny dodajemy metodę do klasy kontrolera i wywołujemy ją w viewdidappear
Dodamy oświetlenie
Gdy dodamy jeszcze
Dodamy dodatkowe oświetlenie
Ustawiamy kamerę
Ręczne sterowanie kamerą Usuwamy sterowanie automatyczne Dodajemy 2 pola w klasie kontrolera Dodajemy nową metodę
Ręczne sterowanie kamerą Dopisujemy kod do tworzenia sceny
Tworzymy atomy Tworzymy nową klasę Atoms.swift
Tworzymy atomy i kolejne atomy
Tworzymy atomy dodajemy kolejną metodę
Kontroler widoku usuwamy pudełko dodajemy tworzenie atomów
Tworzymy cząsteczki Dodajemy klasę Molecules.swift Dopisujemy metody tworzące cząsteczki
Tworzymy cząsteczki Dopisujemy akcję reagująca na zmianę cząsteczki
Tworzymy cząsteczki W Molecules dodajemy metodę pomocniczą I tworzymy prawdziwy metan CH4
SpriteKit i SceneKit wg strony http://www.raywenderlich.com
Inne technologie OpenGL Metal