Trong bài viết này, bạn sẽ học cách sử dụng câu lệnh bảo vệ để kiểm soát luồng thực thi chương trình của bạn.
Swift If Statement mô tả cách bạn có thể thực hiện các hành động dựa trên điều kiện nhất định (giá trị boolean). Trong bài viết này, chúng ta sẽ tìm hiểu những lợi ích của câu lệnh bảo vệ so với câu lệnh if để kiểm soát luồng chương trình và viết mã đơn giản và sạch sẽ hơn.
Tuyên bố bảo vệ Swift
Việc sử dụng chính của câu lệnh bảo vệ là chuyển quyền điều khiển chương trình ra khỏi một phạm vi với những điều kiện nhất định. Các câu lệnh này tương tự với câu lệnh if thực thi các câu lệnh dựa trên điều kiện nhất định (giá trị boolean) nhưng không giống như if, các câu lệnh bảo vệ chỉ chạy khi một số điều kiện nhất định không được đáp ứng.
Hơn nữa, các câu lệnh bên trong trình bảo vệ phải thoát ra khỏi phạm vi. Do đó, chúng ta phải báo cáo kiểm soát chương trình sử dụng return
, break
, continue
hoặc throw
ở phần cuối của báo cáo kết quả bảo vệ.
Cú pháp của Tuyên bố Bảo vệ
biểu thức bảo vệ else (// các câu lệnh // phải chứa một câu lệnh điều khiển: return, break, continue hoặc ném.)
- Ở đây, biểu thức là một biểu thức boolean (trả về một trong hai
true
hoặcfalse
). - Nếu biểu thức được đánh giá thành
false
, các câu lệnh bên trong khối mã củaguard
được thực thi. - Nếu biểu thức được đánh giá thành
true
, các câu lệnh bên trong khối mã củaguard
sẽ bị bỏ qua khỏi quá trình thực thi.
Câu lệnh bảo vệ hoạt động như thế nào?
Lưu ý: Sự kết thúc của tuyên bố bảo vệ phải bao gồm một tuyên bố kiểm soát return
, break
, continue
hoặc throw
.
Ví dụ 1: Câu lệnh bảo vệ hoạt động như thế nào?
Một tuyên bố bảo vệ hợp lệ đơn giản như sau:
guard true else ( print("Condition not met") ) print("Condition met")
Khi bạn chạy chương trình, đầu ra sẽ là:
Điều kiện đáp ứng
Trong chương trình trên, bảo vệ chứa một giá trị boolean true (điều kiện được đáp ứng). Vì, câu lệnh bảo vệ chỉ chạy khi điều kiện không được đáp ứng, câu lệnh bên trong trình bảo vệ không được thực thi. Đó là lý do tại sao print("Condition met")
được thực thi và đầu ra Điều kiện đáp ứng trên màn hình.
Bây giờ hãy thay đổi điều kiện thành false như sau:
Ví dụ 2: câu lệnh bảo vệ phải thoát khỏi phạm vi
guard false else ( print("Condition not met") ) print("Condition met")
Trong chương trình trên, điều kiện bảo vệ được đánh giá là false
. Vì vậy, câu lệnh print("Condition not met")
bên trong else sẽ thực thi. Nhưng bạn sẽ gặp lỗi nói rằng cơ quan 'bảo vệ' có thể không lọt qua được, hãy cân nhắc sử dụng 'quay lại' hoặc 'ném' để thoát khỏi phạm vi.
Các thông báo lỗi trong phương tiện từ đơn giản, bạn cần phải chuyển điều khiển chương trình từ các tuyên bố bảo vệ sử dụng return
, break
, continue
hoặc throw
báo cáo. Bây giờ chúng tôi sẽ sử dụng return
. Và vì return
câu lệnh chỉ có thể được sử dụng bên trong một hàm, chúng ta sẽ giới thiệu đoạn mã ở trên trong Swift Functions.
Ví dụ 3: câu lệnh bảo vệ bên trong một hàm
Chúng ta có thể sử dụng câu lệnh bảo vệ bên trong một hàm trong Swift như:
func someFunction() ( guard false else ( print("Condition not met") return ) print("Condition met") ) someFunction() print("Hello after function call")
Khi bạn chạy chương trình trên, kết quả đầu ra sẽ là:
Điều kiện không được đáp ứng Xin chào sau khi gọi hàm
Trong chương trình trên, điều kiện bảo vệ được đánh giá là false
do đó các câu lệnh bên trong trình bảo vệ sẽ thực thi. Câu lệnh đầu tiên print("Condition not met")
xuất ra Điều kiện không được đáp ứng trong bảng điều khiển.
Và câu lệnh return
kết thúc việc thực thi một hàm và câu lệnh print("Hello, after function call")
sau khi thực thi lệnh gọi hàm sẽ xuất ra Hello sau khi gọi hàm trong bảng điều khiển.
Ví dụ 4: Bảo vệ với các tùy chọn
Chúng ta đã thấy trong Tùy chọn Swift việc sử dụng if-let
để mở một tùy chọn. Tuy nhiên, chúng ta cũng có thể sử dụng câu lệnh bảo vệ thay if-let
cho việc mở gói tùy chọn với một lợi thế. Ưu điểm chính của việc mở gói tùy chọn với bảo vệ thay vì if-let
là chúng ta có thể tăng phạm vi của biến chưa được gói.
Hãy xem điều này trong ví dụ dưới đây:
func changeOptionalStringToUpperCase() ( var name:String? guard let temp = name else ( print("Name is nil. Cannot process") return ) print("Uppercased:(temp.uppercased())") ) changeOptionalStringToUpperCase()
Khi bạn chạy chương trình trên, kết quả đầu ra sẽ là:
Tên là con số không. Không thể xử lý
Trong chương trình trên, bạn có thể thấy giá trị tạm thời chưa được bao bọc đang được sử dụng bên ngoài phạm vi được xác định bởi câu lệnh bảo vệ. Vì tên được định nghĩa tùy chọn và chứa giá trị nil, câu lệnh bảo vệ không thể bỏ gói giá trị.
Vì vậy, các câu lệnh bên trong bảo vệ khác thực thi mà in Tên là nil. Không thể xử lý trong đầu ra và kết thúc hàm bằng return
câu lệnh. Mã tương đương của câu lệnh if-else câu lệnh bảo vệ ở trên là:
func changeOptionalStringToUpperCase() ( var name:String? if let temp = name ( print("Uppercased:(temp.uppercased())") ) else ( print("Name is nil. Cannot process") return ) //how to access temp here?? Solution:Use Guard ) changeOptionalStringToUpperCase()
Lưu ý hai câu lệnh trên đều hợp lệ và thực hiện cùng một công việc. Nhưng khi sử dụng câu lệnh if-let, bạn không thể sử dụng giá trị chưa được bao bọc bên ngoài câu lệnh if-let. Nhưng với câu lệnh bảo vệ, bạn có thể sử dụng giá trị chưa được bao bọc thông qua hàm.
Ví dụ 5: Bảo vệ với nhiều điều kiện
Các câu lệnh bảo vệ cũng có thể xâu chuỗi nhiều điều kiện được phân tách bằng dấu phẩy (,) như:
func changeOptionalStringToUpperCase() ( var name:String? = "" guard let temp = name , temp.count> 0 else ( print("Name is nil or an empty string. Cannot process") return ) print("Uppercased:(temp.uppercased())") ) changeOptionalStringToUpperCase()
Khi bạn chạy chương trình trên, kết quả đầu ra sẽ là:
Tên là nil hoặc một chuỗi rỗng. Không thể xử lý
Trong chương trình trên, câu lệnh bảo vệ chứa hai điều kiện được phân tách bằng dấu phẩy.
Điều kiện đầu tiên bỏ gói let temp = name
một tùy chọn trả về true
trong trường hợp của chúng tôi và điều kiện thứ hai temp.count> 0
kiểm tra xem chuỗi không được gói có nhiều hơn 0 ký tự được đánh giá false
trong ví dụ của chúng tôi hay không.
Do đó, câu lệnh bên trong câu lệnh bảo vệ thực hiện câu lệnh print("Name is nil or an empty string. Cannot process")
xuất ra Tên là nil hoặc một chuỗi rỗng. Không thể xử lý trong bảng điều khiển và kết thúc hàm bằng return
câu lệnh.