Bryn Flow

🍎 Swift & SwiftUI Cheat Sheet

The syntax you look up over and over. Bookmark this page.

← iOS Track

Variables & Functions

let name = "fixed"        // constant
var count = 0              // mutable
let x: Int = 5              // explicit type

func add(_ a: Int, _ b: Int) -> Int { a + b }
func greet(name: String = "there") -> String { "Hi, \(name)" }

let square: (Int) -> Int = { $0 * $0 }

Optionals

var name: String? = nil

if let n = name { print(n) }
guard let n = name else { return }

let display = name ?? "N/A"     // nil-coalescing
name?.count                      // optional chaining
name!                             // force unwrap (avoid)

Collections

let arr = [1, 2, 3]
var dict = ["a": 1, "b": 2]
let set: Set<Int> = [1, 2, 3]

arr.map { $0 * 2 }
arr.filter { $0 > 1 }
arr.first(where: { $0 > 1 })
arr.sorted(by: <)
for (key, value) in dict { }

Structs, Enums & Protocols

struct User: Identifiable {
    let id = UUID()
    var name: String
}

enum Result {
    case success(String)
    case failure(Error)
}

protocol Greetable { func greet() -> String }
extension User: Greetable {
    func greet() -> String { "Hi, \(name)" }
}

SwiftUI State

@State private var count = 0             // local
@Binding var isOn: Bool                    // two-way from parent
@StateObject private var vm = ViewModel()  // owns an ObservableObject
@ObservedObject var vm: ViewModel          // receives one
@EnvironmentObject var settings: Settings  // from environment
@Published var value = 0                   // inside ObservableObject

SwiftUI Layout

VStack(spacing: 12) { /* vertical */ }
HStack { /* horizontal */ }
ZStack { /* overlapping */ }

Text("Hi")
    .font(.title2)
    .padding()
    .background(Color.blue)
    .cornerRadius(12)

Lists & Navigation

List {
    ForEach(items) { item in
        Text(item.title)
    }
    .onDelete(perform: delete)
}

NavigationStack {
    NavigationLink("Details", destination: DetailView())
        .navigationTitle("Home")
}

Async/Await

func loadUser() async throws -> User {
    let (data, _) = try await URLSession.shared.data(from: url)
    return try JSONDecoder().decode(User.self, from: data)
}

.task {
    user = try? await loadUser()
}

async let a = fetchA()
async let b = fetchB()
let (ra, rb) = try await (a, b)   // run concurrently

Want the full explanations?

Every item here is covered in depth on the iOS track.

Back to iOS Track