SwiftUI là gì? Framework UI khai báo cho iOS, macOS, watchOS và visionOS

SwiftUI là gì? Framework UI khai báo cho iOS, macOS, watchOS và visionOS

SwiftUI là framework UI khai báo (declarative) của Apple, ra mắt năm 2019 tại WWDC. Khác với UIKit bắt buộc viết lệnh từng bước (imperative), SwiftUI cho phạn bạn mô tả giao diện dựa trên trạng thái — framework tự động cập nhật giao diện khi dữ liệu thay đổi.

Hôm nay, SwiftUI là ngôn ngữ UI chính thức cho mọi nền tảng Apple: iOS, macOS, watchOS, tvOS và visionOS. Hiểu SwiftUI nghĩa là bạn tiết kiệm 40-60% mã nguồn so với UIKit khi xây dựng ứng dụng đa nền tảng.

Code SwiftUI trong Xcode hiển thị preview trực tiếp bên cạnh code editor

Khai báo UI thay vì mệnh lệnh

Ví dụ cùng một màn hình danh bạ:

UIKit (imperative):

let label = UILabel()
label.text = "Chu Hưng"
label.font = UIFont.boldSystemFont(ofSize: 20)
view.addSubview(label)
NSLayoutConstraint.activate([...]) // thủ công từng constraint

SwiftUI (declarative):

Text("Chu Hưng")
    .font(.title)
    .bold()

SwiftUI tự động định vị, chọn font mặc định theo nền tảng, áp dụng dark mode. Bạn chỉ việc mô tả kết quả mong muốn, framework lo phần còn lại.

Trạng thái và cập nhật giao diện tự động

SwiftUI dùng @State, @Binding, @StateObject, @EnvironmentObject để quản lý dữ liệu. Khi biến trạng thái thay đổi, SwiftUI tái tính toán toàn bộ cây view và chỉ cập nhật phần thay đổi trên màn hình.

Ví dụ counter đơn giản:

struct CounterView: View {
    @State private var count = 0
    var body: some View {
        VStack {
            Text("Số lần bấm: (count)")
            Button("Tăng") { count += 1 }
        }
    }
}

Khi count thay đổi, SwiftUI cập nhật Text ngay lập tức — không cần setNeedsLayout() hay reloadData() như UIKit.

Sơ đồ luồng dữ liệu SwiftUI: State → Body → View hierarchy, có mũi tên thể hiện cập nhật tự động

Stack, List và Form — các view cơ bản

SwiftUI cung cấp stack layout dạng chữ:

  • VStack: xếp dọc (vertical)
  • HStack: xếp ngang (horizontal)
  • ZStack: xếp chồng (depth)

List thay UITableView, Form thay UITableViewController với cài đặt section. Cả hai hỗ trợ search, swipe action, inline editing chỉ với modifier.

So sánh nhanh SwiftUI vs UIKit

Tiêu chí SwiftUI UIKit
Paradigm Declarative Imperative
Số dòng code 40-60% ít hơn Nhiều hơn
Preview Live Preview nội bộ Không có
Multi-platform iOS, macOS, watchOS, tvOS, visionOS iOS, macOS (AppKit riêng)
Hỗ trợ legacy iOS 13+ (2019) Từ iOS 2.0
UIViewRepresentable Cần wrapper để dùng UIKit Native
Animation .animation(), .transition() UIView.animate()

Khi nào nên dùng SwiftUI?

  • Dự án mới: bắt đầu từ iOS 17+ / macOS 14+ cho trải nghiệm tốt nhất
  • Ứng dụng đa nền tảng: chia sẻ code giữa iPhone, iPad, Mac
  • Prototype nhanh: Preview giúp thay đổi UI trong thời gian thực
  • SwiftData / CloudKit: tích hợp sẵn, không cần boilerplate

Vẫn dùng UIKit nếu bạn cần hỗ trợ iOS 12 trở xuống, hoặc tùy chỉnh sâu gesture recognizer, render loop hiệu năng cực cao.

Tổng quan kiến trúc View

SwiftUI dùng cây view (view tree) chứ không phải view hierarchy phức tạp. Mỗi View là struct giá trị (value type), không phải class tham chiếu. Điều này loại bỏ retain cycle và side-effect khó kiểm soát.

Sơ đồ cây view SwiftUI từ root VStack xuống các Text, Image, Button lá

Environment và Dependency Injection

SwiftUI cung cấp hệ thống Environment để truyền dữ liệu xuống cây view mà không dùng initializer:

struct SettingsView: View {
    @Environment(.colorScheme) private var scheme
    @Environment(.locale) private var locale
    var body: some View {
        Text("Theme: (scheme == .dark ? "Tối" : "Sáng")")
    }
}

Bạn có thể inject giá trị tùy chỉnh:

.environment(.theme, Theme.dark)

Cách này thay thế Singleton pattern khó test bằng dependency injection rõ ràng — dễ kiểm thử, dễ mock.

Animations, Transitions và Gestures

SwiftUI animation dùng withAnimation.animation modifier. Bạn không cần tween hay CADisplayLink:

withAnimation(.spring(response: 0.4, dampingFraction: 0.7)) {
    showModal.toggle()
}
.rotationEffect(.degrees(showModal ? 360 : 0))

Gesture cũng khai báo tương tự:

.gesture(
    DragGesture()
        .onChanged { value in
            offset = value.translation
        }
)

SwiftUI tự động merge gesture với animation — kéo thả mượt mà ngay cả với animation đang chạy.

Navigation Stack và Navigation Split View

Từ iOS 16, Apple thay thế NavigationView cũ bằng NavigationStackNavigationSplitView. NavigationStack dùng path-based navigation:

@State private var path = NavigationPath()

NavigationStack(path: $path) {
    List(items) { item in
        NavigationLink(value: item) { Text(item.name) }
    }
    .navigationDestination(for: Item.self) { item in
        DetailView(item: item)
    }
}

NavigationSplitView dành cho iPad/macOS với sidebar + detail:

NavigationSplitView {
    List(selection: $selection) { ... }
} detail: {
    DetailView(item: selection)
}

Cả hai đều hỗ trợ programmatic navigation (push/pop qua path) và deep link tự nhiên.

Kết luận

SwiftUI là tương lai phát triển ứng dụng Apple. Nếu bạn mới học iOS development, học SwiftUI trước — nó gần gũi hơn, dễ debug, và Apple đầu tư mạnh. Nếu bạn đang bảo trì codebase UIKit cũ, dùng UIViewRepresentable để tích từng module SwiftUI vào từng bước.

Tham khảo thêm: Apple Developer SwiftUI, Hacking with Swift, Wikipedia

Tôi là một lập trình viên IOS. Code chính là IOS nhưng thỉnnh thoảng vẫn đá sang Android hoặc web. Mặc dù không quá thông thạo nhưng tôi sẽ chia sẻ những kiến thức mà mình đã tìm hiểu, áp dụng qua.

Bài viết liên quan

Tauri 2.0: Ứng Dụng Desktop Rust Ra Mắt Mobile iOS/Android

Tauri 2.0: Ứng Dụng Desktop Rust Ra Mắt Mobile iOS/Android Tauri 2.0 stable ra mắt tháng 10/2024 đánh dấu milestone quan trọng: framework Rust-first cho desktop giờ đã hỗ trợ…

Xem thêm

WASI là gì? Chạy WebAssembly ngoài trình duyệt

WASI là gì? Chạy WebAssembly ngoài trình duyệt WebAssembly (Wasm) đã chứng minh khả năng chạy code gần native trong trình duyệt. Nhưng tiềm năng thực sự của Wasm nằm…

Xem thêm

Java 23: 12 tính năng mới và so sánh với JDK 21 LTS

Java 23 (JDK 23) ra mắt tháng 9/2024 mang 12 JEPs mới, nhưng không phải là phiên bản LTS. Bài viết này giải thích chi tiết các tính năng đáng…

Xem thêm
0 0 đánh giá
Article Rating
Theo dõi
Thông báo của
guest
0 Comments
Cũ nhất
Mới nhất Được bỏ phiếu nhiều nhất