W Swift dostępne są następujące obiekty typu: wyliczenia (enum), struktury (struct) i klasy (class).
Obiekty typu mogą zawierać następujące elementy:
- Metody inicjalizacyjne
- Właściwości
- Metody
- Indeksy
- Deklaracje obiektu typu
Metody inicjalizacyjne
Metoda inicjalizacyjna (init) jest funkcją, która jest wywoływana, aby utworzyć nowy obiekt.
class Figure
{
var name = ""
var id = 0
init()
{
}
init(name:String)
{
self.name = name
}
init(id:Int)
{
self.id = id
}
init(name:String, id:Int)
{
self.name = name
self.id = id
}
/*
init(name:String = "", id:Int = 0)
{
self.name = name
self.id = id
}
*/
}
var a = Figure()
var b = Figure(name: "kwadrat")
var c = Figure(id: 1)
var d = Figure(name: "kwadrat", id: 2)
Powyższy kod można uprościć, tworząc funkcję inicjalizacyjną z wykorzystaniem domyślnych parametrów:
class Figure
{
var name = ""
var id = 0
init(name:String = "", id:Int = 0)
{
self.name = name
self.id = id
}
}
W powyższych przykładach wlasciwosci maja określone wartości domyślne w oparciu o które kompilator określa typ danych. Można jawnie określić typ danych, ale w tej sytuacji należy w funkcji inicjalizacyjnej ustawić wszystkie wartości.
class Figure
{
var name : String
var id : Int
init(name:String = "", id:Int = 0)
{
self.name = name
// self.id = id // odkomentuj - błąd kompilacji: Return from
// initializer without initializing all stored properties
}
}
Jeżeli zakładamy, że utworzenie obiektu dla pewnych parametrów nie ma sensu, możemy zwrócić z inicjalizatora wartość nil.
class Figure
{
var name : String
var id : Int
init?(name:String = "", id:Int = 0)
{
if name.isEmpty
{
return nil
}
if id <= 0
{
return nil
}
self.name = name
self.id = id
}
}
var a = Figure()
if a == nil
{
print("Nieokreślona figura")
}
// Wynik wykonania programu:
// Nieokreślona figura
Właściwości
Właściwość to zmienna zadeklarowana w typie obiektu. Przy założeniu, że mamy obiektu typu Figure i chcemy uzyskać dane z dlasciwosci name, robimy to jak poniżej:
var f = Figure("kwadrat", 1)
let n = f.name
Własciwość może być statyczna, dzięki czemu dostęp do niej jest globalny.
class Counter
{
static var counter : Int = 0
init()
{
Counter.counter += 1
}
}
var c = Counter()
var count = Counter.counter
print(count)
// Wynik wykonania programu:
// 1
Metoda
Metoda jest funkcją zadeklarowaną na poziomie deklaracji obiektu typu. Dostęp do niej odbywa się za pomocą obiektu danego typu. Funkcja deklarowana jest analogicznie do funkcji w przestrzeni globalnej.
Metoda, która w deklaracji ma słowo kluczowe static jest metodą statyczną, do której można się odwołać za pomocą typu.
Indeks
Umożliwia zbudowanie dostępu do elementów obiektu typu za pomocą nawiasów kwadratowych przy egzemplarzu obiektu. Przydatne jest jeżeli obiekt zawiera elementy, do których przydatny będzie dostęp za pomocą klucza lub indeksu liczbowego.
class MyContainer
{
var container : Array<Int>
init?(max : Int)
{
if max <= 0
{
return nil
}
self.container = Array(repeating: 0, count: max)
var n : Int = 0
while n < max
{
self.container[n] = n + 1
n += 1
}
}
subscript(index:Int) -> Int
{
get
{
if index < container.count
{
return container[index]
}
return -1
}
set
{
if index >= 0 && index < container.count
{
container[index] = newValue
}
}
}
}
var container = MyContainer(max : 10)
var item = container?[5]
container?[5] = 100
Słowo kluczowe subscript deklaruje indeks, po którym następuje określenie zmiennej i jej typu za pomocą którego nastąpi odwołanie do elementów obiektu.
W powyższym przykładzie został użyty inicjalizator, który nie tworzy obiektu, jeżeli liczba elementów jest mniejsza od 0, stąd odwołanie do elementów przez dodanie znaku zapytania przed nawiasem kwadratowym. Takie odwołanie nazywamy rozpakowaniem wartości.
W przypadku inicjalizatora, który nie zwraca wartości nil, znak zapytania nie jest wymagany.
Typ wyliczeniowy
enum definiuje zbiór elementów, który zawiera predefiniowane wartości.
enum Action
{
case create
case read
case update
case delete
}
let action = Action.create
let a : Action = .create