Swift Cheat Sheet: ściąga ze Swifta
Ostatnia aktualizacja
Hello World i podstawy
Swift nie wymaga kodu szablonowego na najwyższym poziomie: wystarczy jedna linia.
| Operacja | Składnia |
|---|---|
| Wypisanie linii | print("Hello, World!") |
| Wypisanie bez nowej linii | print("Hi", terminator: "") |
| Interpolacja stringów | print("Hi \(name)") |
| Komentarz | // this is a comment |
| Komentarz wieloliniowy | /* ... */ |
| Import modułu | import Foundation |
| Uruchomienie pliku | swift run lub swift main.swift |
Zmienne (let / var) i typy
Używaj let dla stałych i var dla wartości zmiennych; typy są zwykle wnioskowane.
| Operacja | Składnia |
|---|---|
| Stała | let age = 30 |
| Variable | var count = 0 |
| Jawny typ | let name: String = "Ada" |
| Typy podstawowe | Int, Double, String, Bool, Character |
| Konwersja typu | Double(i), String(n), Int("42") |
| Krotka | let pair = (1, "a") |
| Alias typu | typealias ID = Int |
| Sprawdzenie typu | value is String, value as? String |
Opcjonale
Opcjonale opisują możliwy brak wartości; przed użyciem trzeba je rozpakować.
| Operacja | Składnia |
|---|---|
| Deklaracja opcjonala | var name: String? = nil |
| Wiązanie opcjonala (optional binding) | if let n = name { ... } |
| Rozpakowanie przez guard | guard let n = name else { return } |
| Nil-coalescing | let n = name ?? "default" |
| Optional chaining | user?.address?.city |
| Wymuszone rozpakowanie (niebezpieczne) | name! |
| Niejawnie rozpakowany | var name: String! |
| Map na opcjonalu | name.map { $0.count } |
Stringi
Stringi to typy wartościowe z pełną obsługą Unicode.
| Operacja | Składnia |
|---|---|
| Długość | s.count |
| Wielkie / małe litery | s.uppercased(), s.lowercased() |
| Łączenie (konkatenacja) | "foo" + "bar" |
| Interpolacja | "Total: \(price)" |
| Sprawdzenie, czy zawiera | s.contains("ell") |
| Sprawdzenie prefiksu / sufiksu | s.hasPrefix("he") |
| Podział | s.split(separator: ",") |
| Zamiana | s.replacingOccurrences(of: "a", with: "b") |
| String wieloliniowy | """ ... """ |
Kolekcje (Array, Dictionary, Set)
Trzy podstawowe typy kolekcji, wszystkie są typami wartościowymi.
| Operacja | Składnia |
|---|---|
| Literał tablicy | var nums = [1, 2, 3] |
| Dodanie na końcu | nums.append(4) |
| Dostęp / liczba elementów | nums[0], nums.count |
| Map / filter | nums.map { $0 * 2 }, nums.filter { $0 > 1 } |
| Literał słownika | var ages = ["Ada": 30] |
| Dostęp do słownika | ages["Ada"] zwraca opcjonal |
| Literał zbioru | var ids: Set = [1, 2, 3] |
| Wstawienie do zbioru | ids.insert(4) |
| Iteracja po słowniku | for (k, v) in ages { ... } |
Instrukcje sterujące
Warunki nie wymagają nawiasów; switch musi obejmować wszystkie przypadki.
| Operacja | Składnia |
|---|---|
| If / else | if x > 0 { ... } else { ... } |
| Operator trójargumentowy | let r = x > 0 ? "pos" : "neg" |
| Switch | switch n { case 1: ...; default: ... } |
| Switch z zakresem | case 1...5: ... |
| Pętla for-in | for i in 0..<10 { ... } |
| Pętla for-in po tablicy | for item in items { ... } |
| Pętla while | while x < 100 { ... } |
| Repeat-while | repeat { ... } while x < 100 |
| Break / continue | break, continue |
Funkcje i domknięcia
Funkcje mają etykietowane parametry; domknięcia to samodzielne bloki kodu.
| Operacja | Składnia |
|---|---|
| Definicja funkcji | func add(a: Int, b: Int) -> Int { a + b } |
| Etykieta zewnętrzna | func greet(to name: String) { ... } |
| Parametr domyślny | func greet(name: String = "World") { ... } |
| Parametr zmiennej długości | func sum(_ nums: Int...) -> Int { ... } |
| Kilka wartości zwracanych (krotka) | func bounds() -> (min: Int, max: Int) { ... } |
| Wyrażenie domknięcia | let f = { (x: Int) -> Int in x * x } |
| Domknięcie końcowe (trailing closure) | nums.map { $0 * 2 } |
| Skrócone argumenty | { $0 + $1 } |
Struktury a klasy
Struktury to typy wartościowe (kopiowane); klasy to typy referencyjne (współdzielone).
| Operacja | Składnia |
|---|---|
| Definicja struktury | struct Point { var x: Int; var y: Int } |
| Definicja klasy | class Person { var name: String } |
| Inicjalizator klasy | init(name: String) { self.name = name } |
| Utworzenie instancji | let p = Point(x: 1, y: 2) |
| Metoda mutująca struktury | mutating func move() { x += 1 } |
| Metoda klasy | func greet() { ... } |
| Dziedziczenie (tylko klasy) | class Student: Person { ... } |
| Właściwość obliczana | var area: Int { width * height } |
| Składowa statyczna | static let shared = Manager() |
Enumy
Enumy grupują powiązane wartości i mogą przenosić powiązane dane.
| Operacja | Składnia |
|---|---|
| Definicja enuma | enum Direction { case north, south } |
| Użycie przypadku | let d = Direction.north |
| Switch po enumie | switch d { case .north: ... } |
| Wartości surowe (raw values) | enum Status: Int { case ok = 200 } |
| Dostęp do wartości surowej | Status.ok.rawValue |
| Inicjalizacja z wartości surowej | Status(rawValue: 200) |
| Wartości powiązane | case result(Int, String) |
| Metody w enumach | func label() -> String { ... } |
Najczęściej używana składnia Swifta na jednej stronie. Ten Swift cheat sheet to szybka ściąga z rdzenia języka: stałe i zmienne, opcjonale, stringi, kolekcje, instrukcje sterujące, funkcje i domknięcia, a do tego struktury, klasy i enumy, z których budujesz aplikacje na iOS i macOS.
Wszystko tutaj to standardowy Swift, który kompiluje się oficjalnym toolchainem. Skopiuj to, czego potrzebujesz, albo uruchom każdy fragment w edytorze online Swifta, bez Xcode.
Swift cheat sheet: FAQ
Czy ten Swift cheat sheet jest darmowy?
Jak rozpakować opcjonal w Swift?
nil, więc przed użyciem trzeba go rozpakować. Bezpieczne sposoby to wiązanie opcjonala (if let n = name { ... }), guard let na początku funkcji, operator nil-coalescing (name ?? "default") i optional chaining (user?.name). Wymuszone rozpakowanie przez name! działa, ale powoduje awarię, gdy wartość to nil, więc sięgaj po nie tylko wtedy, gdy masz pewność.Czym różni się struktura od klasy w Swift?
struct to typ wartościowy: przypisanie lub przekazanie tworzy kopię, więc zmiany nie wpływają na oryginał. class to typ referencyjny: kopie współdzielą tę samą instancję, a dziedziczenie obsługują tylko klasy. Apple zaleca domyślnie wybierać struktury, a klasy stosować, gdy potrzebujesz współdzielonego, zmiennego stanu albo dziedziczenia.