Tùy chọn Swift: Cách sử dụng chúng (Có ví dụ)

Trong bài viết này, bạn sẽ tìm hiểu về tùy chọn, các trường hợp sử dụng và xử lý tùy chọn trong Swift.

Trong bài trước, chúng ta đã tìm hiểu về các kiểu dữ liệu khác nhau có sẵn trong Swift và cũng nhận thấy rằng biến hoặc hằng được khai báo của những kiểu đó chứa giá trị mặc định.

Thí dụ:

 let someValue = Int () print (someValue) 

Khi bạn chạy chương trình, đầu ra sẽ là:

 0

Tuy nhiên, có một kiểu dữ liệu khác trong Swift được gọi là Tùy chọn, có giá trị mặc định là giá trị null ( nil). Bạn có thể sử dụng tùy chọn khi bạn muốn một biến hoặc hằng số không chứa giá trị trong đó. Kiểu tùy chọn có thể chứa giá trị hoặc không có giá trị (giá trị null).

Không về mặt kỹ thuật, bạn có thể nghĩ tùy chọn như một hộp đựng giày. Hộp đựng giày có thể có hoặc không có giày trong đó. Vì vậy, bạn nên biết trước khi lấy giày từ hộp.

Làm thế nào để khai báo một tùy chọn?

Bạn có thể chỉ cần trình bày một loại Dữ liệu là Tùy chọn bằng cách thêm !hoặc ?vào Type. Nếu một tùy chọn chứa một giá trị trong đó, nó sẽ trả về giá trị là Optional, nếu không, nó trả về nil.

Ví dụ 1: Làm thế nào để khai báo một tùy chọn trong Swift?

 var someValue:Int? var someAnotherValue:Int! print(someValue) print(someAnotherValue) 

Khi bạn chạy chương trình, đầu ra sẽ là:

 nil nil

Trong chương trình trên, chúng tôi đã khởi tạo một kiểu tùy chọn bằng cách sử dụng ?!. Cả hai cách đều hợp lệ để tạo tùy chọn nhưng có một điểm khác biệt chính mà chúng ta sẽ khám phá bên dưới.

Khai báo một Int tùy chọn có nghĩa là biến sẽ có giá trị nguyên hoặc không có giá trị. Vì không có giá trị nào được gán cho biến, bạn có thể thấy cả hai printkết quả đầu ra của câu lệnh niltrên màn hình.

Ví dụ 2: Gán và truy cập một giá trị từ một tùy chọn

 let someValue:Int? = 5 print(someValue) print(someValue!) 

Khi bạn chạy chương trình, đầu ra sẽ là:

 Tùy chọn (5) 5 

Trong chương trình trên, chúng ta đã khai báo một kiểu tùy chọn Intvà gán giá trị 5 cho nó.

Như bạn có thể thấy, việc in tùy chọn như print(someValue)không mang lại cho bạn 5nhưng Optional(5). Nó có dạng như mô tả ở trên: Optional. Để truy cập từ nó, chúng ta cần một cơ chế được gọi là mở gói .

Bạn có thể mở một tùy chọn bằng cách thêm !ký tự vào cuối biến / hằng số như trong dòng tiếp theo print(someValue!). print(someValue!)mở gói tùy chọn và xuất 5trên màn hình.

Tuy nhiên, hãy nhớ rằng loại cơ chế mở gói này chỉ nên được sử dụng khi bạn chắc chắn rằng tùy chọn chắc chắn sẽ có giá trị khi bạn truy cập nó.

Ví dụ 3: Khai báo rõ ràng một tùy chọn chưa được bao bọc

Bạn cũng có thể tạo một tùy chọn chưa được bao bọc như:

 let someValue:Int! = 5 print(someValue) 

Khi bạn chạy chương trình, đầu ra sẽ là:

 5

Trong chương trình trên, Int!tạo một tùy chọn chưa được gói, tự động mở gói giá trị trong khi bạn truy cập nó để bạn không cần phải thêm !ký tự vào mọi lúc .

Hãy chắc chắn rằng khi bạn sử dụng các loại tùy chọn này, biến sẽ luôn cần có một giá trị khi bạn truy cập nó. Nếu không, bạn sẽ gặp phải lỗi nghiêm trọng.

Ví dụ 4: Lỗi nghiêm trọng khi truy cập một tùy chọn không được bao bọc bằng null

 var someValue:Int! var unwrappedValue:Int = someValue //crashes due to this line 

Khi bạn chạy chương trình, bạn sẽ gặp phải một lỗi nghiêm trọng: không tìm thấy bất ngờ trong khi mở một giá trị Tùy chọn vì mã unwrappedValue:Int = someValuecố gắng gán giá trị từ someValue tùy chọn thành biến unsrappedValue.

Tuy nhiên, somevalue là một Optionalkiểu có chứa nilgiá trị. Cố gắng gán giá trị nil cho biến unsrappedValue không phải là tùy chọn sẽ dẫn đến sự cố.

Có các kỹ thuật khác nhau để xử lý trường hợp này được giải thích bên dưới.

Xử lý tùy chọn

Để sử dụng giá trị của một tùy chọn, nó cần phải được mở ra. Cách tốt hơn để sử dụng giá trị tùy chọn là bằng cách mở gói có điều kiện thay vì buộc mở bằng !toán tử.

Điều này là do việc mở gói có điều kiện hỏi Kiểm tra xem biến này có giá trị không? . Nếu có, hãy cung cấp giá trị, nếu không, nó sẽ xử lý trường hợp nil.

Ngược lại, buộc mở gói cho biết Biến này không có giá trị khi bạn sử dụng nó . Do đó, khi bạn buộc mở một biến nil, chương trình của bạn sẽ ném một biến nil không mong đợi được tìm thấy trong khi mở một ngoại lệ tùy chọn và sự cố . Một số kỹ thuật để mở gói có điều kiện được giải thích dưới đây:

1. Câu lệnh if

Bạn có thể sử dụng câu lệnh if và so sánh tùy chọn với nil để tìm xem một tùy chọn có chứa giá trị hay không. Bạn có thể sử dụng toán tử so sánh "bằng với" toán tử ( ==) hoặc "không bằng" ( !=) trong câu lệnh if.

Ví dụ 5: Tùy chọn xử lý với câu lệnh if else

 var someValue:Int? var someAnotherValue:Int! = 0 if someValue != nil ( print("It has some value (someValue!)") ) else ( print("doesn't contain value") ) if someAnotherValue != nil ( print("It has some value (someAnotherValue!)") ) else ( print("doesn't contain value") ) 

Khi bạn chạy chương trình, đầu ra sẽ là:

 không chứa giá trị Nó có một số giá trị 0 

Trong chương trình trên, mã bên trong câu lệnh if thực thi nếu một tùy chọn chứa một giá trị, nếu không câu lệnh bên trong khối else sẽ thực thi. Hạn chế chính của xử lý tùy chọn sử dụng kỹ thuật này là, bạn vẫn cần phải mở giá trị khỏi !toán tử sử dụng tùy chọn .

2. Ràng buộc tùy chọn (if-let)

Optional binding helps you to find out whether an optional contains a value or not. If an optional contains a value, that value is available as a temporary constant or variable. Therefore, optional binding can be used with if statement to check for a value inside an optional, and to extract that value into a constant or variable in a single action.

Example 5: Optional handling using if let statement

 var someValue:Int? var someAnotherValue:Int! = 0 if let temp = someValue ( print("It has some value (temp)") ) else ( print("doesn't contain value") ) if let temp = someAnotherValue ( print("It has some value (temp)") ) else ( print("doesn't contain value") ) 

When you run the program, the output will be:

 doesn't contain value It has some value 0 

In the above program, the code inside if statement executes if the optional contains a value. Otherwise the else block gets executed. The if-let statement also automatically unwraps the value and places the unwrapped value in temp constant. This technique has major advantage because you don't need to forcely unwrap the value although being certain an optional contains a value.

3. Guard statement

You can use guard to handle optionals in Swift. Don't worry if you don't know what guard is. For now, just think of guard as an if-else condition with no if block. If the condition fails, else statement is executed. If not, next statement is executed. See Swift guard for more details.

Example 6: Optional handling using guard-let

 func testFunction() ( let someValue:Int? = 5 guard let temp = someValue else ( return ) print("It has some value (temp)") ) testFunction() 

When you run the program, the output will be:

 It has some value 5

In the above program, the guard contains a condition whether an optional someValue contains a value or not. If it contains a value then guard-let statement automatically unwraps the value and places the unwrapped value in temp constant. Otherwise, else block gets executed and and it would return to the calling function. Since, the optional contains a value, print function is called.

4. Nil-coalescing operator

In Swift, you can also use nil-coalescing operator to check whether a optional contains a value or not. It is defined as (a ?? b). It unwraps an optional a and returns it if it contains a value, or returns a default value b if a is nil.

Example 7: Optional handling using nil-coalescing operator

 var someValue:Int! let defaultValue = 5 let unwrappedValue:Int = someValue ?? defaultValue print(unwrappedValue) 

When you run the program, the output will be:

 5

Trong chương trình trên, biến someValue được định nghĩa tùy chọn và chứa giá trị nil. Toán tử liên kết nil không thể mở gói tùy chọn do đó trả về defaultValue. Do đó, câu lệnh print(unwrappedValue)xuất ra 5 trong bảng điều khiển.

 var someValue:Int? = 10 let defaultValue = 5 let unwrappedValue:Int = someValue ?? defaultValue print(unwrappedValue) 

Khi bạn chạy chương trình, đầu ra sẽ là:

 10

Tuy nhiên, trong chương trình trên, biến tùy chọn someValue được khởi tạo với giá trị 10. Vì vậy, toán tử liên kết nil đã mở thành công giá trị khỏi someValue. Do đó, câu lệnh someValue ?? defaultValuetrả về 10 và câu lệnh print(unwrappedValue)xuất ra 10 trong bảng điều khiển.

thú vị bài viết...