[Video Summary] Complex JSON & SwiftData - SwiftyWeather Mid-Term Exam Solution
Mô tả nhanh
Video này trình bày lời giải cho bài thi giữa kỳ môn lập trình iOS/macOS với Swift và SwiftUI, tập trung vào việc xây dựng ứng dụng thời tiết SwiftyWeather. Nội dung bao gồm việc xử lý JSON phức tạp, truy cập API, lưu trữ dữ liệu bằng SwiftData và các kỹ thuật giao diện người dùng.
Video
Mô tả chi tiết
Video này trình bày lời giải cho bài thi giữa kỳ môn lập trình iOS/macOS với Swift và SwiftUI, tập trung vào việc xây dựng ứng dụng thời tiết SwiftyWeather.
Nội dung chi tiết của video bao gồm các bước sau:
-
Thiết lập dự án Xcode:
- Tạo dự án Xcode mới tên "SwiftyWeather".
- Tải xuống và thêm icon ứng dụng, màn hình chờ.
- Đổi tên ContentView thành WeatherView.
- Thay đổi cấu trúc view thành NavigationStack.
-
Xây dựng giao diện người dùng (UI):
- Thêm các text view hiển thị thông tin thời tiết (biểu tượng thời tiết, "Wild Weather", nhiệt độ, gió...).
- Thêm toolbar với nút gear ở góc trên bên phải.
- Tạo màu nền cyan với độ mờ 75%, làm cho toàn bộ view trở lên trong suốt, bao gồm cả toolbar.
- Đổi tất cả các view (trừ biểu tượng thời tiết) sang màu trắng.
- Tạo biểu tượng thời tiết hiển thị nhiều màu.
-
Tạo ViewModel và truy cập API:
- Tạo class
WeatherViewModelđể quản lý dữ liệu và logic. - Khai báo URL API để lấy dữ liệu thời tiết.
- Định nghĩa các cấu trúc dữ liệu
Returned,CurrentvàDailyđể tương ứng với cấu trúc JSON trả về từ API. - Tạo hàm
getDatađể tải dữ liệu từ API và giải mã JSON. - Gọi hàm
getDatakhi view hiển thị lần đầu (sử dụngtask). - In giá trị temperature 2m để kiểm tra xem việc truy xuất API có hoạt động không.
- Gán giá trị từ JSON vào các biến trong
WeatherViewModel(temperature,feelsLike,windSpeed,weatherCode).
- Tạo class
-
Hiển thị dữ liệu thời tiết:
- Thay thế dữ liệu mẫu trong WeatherView với dữ liệu lấy từ API thông qua WeatherViewModel.
- Hiển thị weather code, nhiệt độ, tốc độ gió, nhiệt độ cảm thấy.
- Sử dụng hàm
getWeatherDescriptionvàgetWeatherIconđể hiển thị mô tả thời tiết và biểu tượng tương ứng. - Hiển thị danh sách dự báo thời tiết 7 ngày tới với icon thời tiết, ngày trong tuần, nhiệt độ cao nhất/thấp nhất.
-
Phân tích JSON nâng cao
- Lấy dữ liệu từ mảng
time,weather_code,temp_2m_max,temp_2m_mintừ keydailytrong JSON. - Tạo các thuộc tính trong
WeatherViewModellà mảngdate,dailyWeatherCode,dailyHighTemp,dailyLowTemptương ứng với các mảng trên trong JSON - Hiển thị danh sách dữ liệu dự báo ngày trong tuần tương ứng với icon thời tiết, nhiệt độ cao nhất và thấp nhất trong một list.
- Tạo hàm
getWeekdayđể lấy tên thứ trong tuần từ ngày hiện tại.
- Lấy dữ liệu từ mảng
-
Tạo View tùy chỉnh Preference:
- Tạo View mới
PreferenceViewđể người dùng có thể tùy chỉnh các thiết lập. - Thêm các text field để nhập tên vị trí, vĩ độ, kinh độ, picker để chọn hệ đơn vị (Imperial/Metric), toggle để chọn có hiển thị độ F/C.
- Tạo
enum UnitSystemvới các caseimperialvàmetriccho phần lựa chọn đơn vị nhiệt độ và tốc độ gió. - Thêm toolbar với nút Cancel và Save.
- Thay đổi giao diện của listview để có màu nền trong suốt.
- Tạo View mới
-
Lưu trữ cài đặt bằng SwiftData:
- Tạo class
Preferencevới các thuộc tính tương ứng với các cài đặt trongPreferenceView. - Thêm
initđể khởi tạo các giá trị mặc định. - Sử dụng
@Modelvà@MainActorđể làm việc với SwiftData. - Tạo mock data để test giao diện.
- Tạo class
-
Kết nối PreferenceView với SwiftData:
- Import SwiftData & add
@EnvironmentmodelContext, dismiss tạiPreferenceView. - Đọc dữ liệu được lưu trong SwiftData khi View
PreferenceViewhiển thị. - Lưu data vào SwiftData khi nhấn nút Save.
- Xóa bỏ các giá trị được lưu trước đó để đảm bảo luôn chỉ có 1 entry được lưu vào.
- Import SwiftData & add
-
Kết nối WeatherView với PreferenceView
- Thêm một biến
sheetIsPresentedđể kiểm soát việc hiển thịPreferenceView. - Hiện
PreferenceViewkhi chạm vào nútgeartrên toolbar.
- Thêm một biến
-
Đọc và sử dụng cài đặt từ SwiftData:
- Import Swift Data & add
@EnvironmentmodelContext tạiWeatherView. - Đọc dữ liệu preference trong
WeatherView. - Cập nhật URL API dựa trên các cài đặt trong
Preference. - Thay đổi các thông số nhiệt độ, tốc độ gió, đơn vị tính và các text value trên
WeatherViewdựa vào thông tin vừa được cập nhật từ preference. - Thêm
onChangemodifier, khi giá trị trongpreferencethay đổi sẽ tự động fetch data và update UI.
- Import Swift Data & add
-
Cập nhật giao diện người dùng:
- Thêm computed property
degreeLabelđể thay đổi hiển thị F/C hoặc không hiển thị giá trị này tùy vào cài đặt của người dùng. - Thay đổi giao diện danh sách thời tiết hiển thị symbol, ngày, nhiệt độ cao nhất, thấp nhất và đơn vị tương ứng.
- Thêm computed property
Chúc bạn học tập hiệu quả và xây dựng được những ứng dụng iOS/macOS tuyệt vời!