Swift: Modern Apple Development
Learn Swift to create amazing iOS, macOS, watchOS, and tvOS apps
1 Loading...
Swift: Modern Apple Development
Swift is a powerful and intuitive programming language created by Apple in 2014. Designed to be safe, fast, and expressive, Swift is the primary language for iOS, macOS, watchOS, tvOS development, and even server-side applications.
Why Swift? Swift combines near-C performance with modern, safe syntax. With SwiftUI, creating native interfaces has never been simpler and more declarative.
Distinctive Features
- Type Safety - Rigorous type system that prevents errors
- Optionals - Elegant handling of null values
- Protocol-Oriented - Composition over inheritance
- Value Types - Structs and enums as first-class citizens
- SwiftUI - Declarative framework for interfaces
- Concurrency - Native async/await and actors
Fundamentals
Types and Variables
// Constants and variables
let name: String = "Maria" // Constant (immutable)
var age: Int = 25 // Variable (mutable)
let height = 1.68 // Type inference (Double)
let active = true // Bool
// Optionals - values that can be nil
var email: String? = nil
email = "[email protected]"
// Optional binding
if let safeEmail = email {
print("Email: \(safeEmail)")
}
// Guard for early exit
func processEmail(_ email: String?) {
guard let email = email else {
print("Invalid email")
return
}
print("Processing: \(email)")
}
// Nil coalescing
let displayEmail = email ?? "Not provided"
// Arrays and Dictionaries
var fruits: [String] = ["apple", "banana", "orange"]
fruits.append("grape")
var users: [String: Int] = [
"alice": 25,
"bob": 30
]
Functions and Closures
// Function with named parameters
func greet(person name: String, with message: String = "Hello") -> String {
return "\(message), \(name)!"
}
let greeting = greet(person: "Maria", with: "Welcome")
// Multiple returns with tuples
func calculateStatistics(_ numbers: [Int]) -> (min: Int, max: Int, sum: Int) {
let min = numbers.min() ?? 0
let max = numbers.max() ?? 0
let sum = numbers.reduce(0, +)
return (min, max, sum)
}
// Closures
let double = { (number: Int) -> Int in
return number * 2
}
// Simplified closure
let triple: (Int) -> Int = { $0 * 3 }
// Higher-order functions
let numbers = [1, 2, 3, 4, 5]
let doubled = numbers.map { $0 * 2 }
let evens = numbers.filter { $0 % 2 == 0 }
let sum = numbers.reduce(0, +)
Structs and Classes
// Struct (value type) - preferred in Swift
struct User: Identifiable, Codable {
let id: UUID
var name: String
var email: String
var active: Bool
init(name: String, email: String) {
self.id = UUID()
self.name = name
self.email = email
self.active = true
}
mutating func deactivate() {
active = false
}
func greet() -> String {
"Hello, \(name)!"
}
}
// Class (reference type)
class UserManager: ObservableObject {
@Published var users: [User] = []
func add(_ user: User) {
users.append(user)
}
func remove(id: UUID) {
users.removeAll { $0.id == id }
}
}
Enums and Pattern Matching
// Enum with associated values
enum Result<T> {
case success(T)
case failure(message: String, code: Int)
}
// Enum with raw values
enum Status: String, CaseIterable {
case pending = "PENDING"
case approved = "APPROVED"
case rejected = "REJECTED"
var emoji: String {
switch self {
case .pending: return "⏳"
case .approved: return "✅"
case .rejected: return "❌"
}
}
}
// Pattern matching with switch
func process<T>(_ result: Result<T>) {
switch result {
case .success(let value):
print("Success: \(value)")
case .failure(let message, let code) where code >= 500:
print("Critical error (\(code)): \(message)")
case .failure(let message, let code):
print("Error (\(code)): \(message)")
}
}
Modern Concurrency
// async/await
func fetchUser(id: UUID) async throws -> User {
let url = URL(string: "https://api.example.com/users/\(id)")!
let (data, _) = try await URLSession.shared.data(from: url)
return try JSONDecoder().decode(User.self, from: data)
}
// Multiple parallel tasks
func fetchData() async throws -> (User, [Product]) {
async let user = fetchUser(id: UUID())
async let products = fetchProducts()
return try await (user, products)
}
// Actors for thread safety
actor SafeCounter {
private var value = 0
func increment() {
value += 1
}
func getValue() -> Int {
value
}
}
Basic SwiftUI
import SwiftUI
struct ContentView: View {
@StateObject private var viewModel = UsersViewModel()
@State private var showForm = false
var body: some View {
NavigationStack {
List(viewModel.users) { user in
NavigationLink(destination: UserDetailView(user: user)) {
HStack {
Image(systemName: "person.circle")
.foregroundColor(.blue)
VStack(alignment: .leading) {
Text(user.name)
.font(.headline)
Text(user.email)
.font(.caption)
.foregroundColor(.secondary)
}
}
}
}
.navigationTitle("Users")
.toolbar {
Button(action: { showForm = true }) {
Image(systemName: "plus")
}
}
.sheet(isPresented: $showForm) {
NewUserView(viewModel: viewModel)
}
}
}
}
Essential Tools
| Tool | Purpose |
|---|---|
| Xcode | Apple’s official IDE |
| Swift Package Manager | Dependency manager |
| TestFlight | Beta testing |
| Instruments | Profiling and debugging |
Learning Checklist
- Master optionals and unwrapping
- Understand structs vs classes
- Learn protocols and extensions
- Study async/await and actors
- Practice SwiftUI
- Explore Combine framework
- Publish an app to the App Store
Essential Resources
Quote
“Swift is the most powerful and intuitive language we’ve ever created.” - Craig Federighi, Apple
Swift is the gateway to the rich Apple ecosystem. Start today and create amazing apps!