Các bạn chưa xem phần 1, 2 có thể tham khảo:
Phần 1
Phần 2

Phần 3 bao gồm:

  • Optionals
  • Kiểm soát lỗi (Error Handling)
  • Gỡ rối (Debugging with Assertions)

Optionals

Sở dĩ mình để nguyên Optionals là vì mình cũng không biết phải dịch làm sao cho dễ hiểu mà không mất đi ý nghĩa của nó. Vì thế các bạn chịu khó xem ví dụ bên dưới để hình dung :smile:

let strNumber = "123" let number = Int(strNumber) 

Đoạn code trên dùng để convert String sang Int. Tuy nhiên, nếu String kia không phải là 123, mà là “hello kipalog” thì sao? Ở một số ngôn ngữ khác, đặc biệt là C# 5 trở xuống sẽ báo lỗi. Còn C# 6 thì có kiểu Int?. Swift cũng tương tự như vậy!

let strNumber = "123aaa" let number = Int(strNumber) 

Lúc này number sẽ mang kiểu Int? và vì strNumber không phải 1 số, nên number sẽ mang giá trị nil (null ấy)

nil
nil cũng là null trong các ngôn ngữ lập trình khác, và hiển nhiên. Mặc định bạn khai báo một biến nào đó mà không có giá trị, Swift sẽ tự gán cho biến đó giá trị nil

Optionals Binding

if let actualNumber = Int(possibleNumber) { print("'(possibleNumber)' mang giá trị là (actualNumber)") } else { print("'(possibleNumber)' không thể ép kiểu sang số nguyên") } 

Đoạn code trên có thể hiểu đơn giản thế này.
“Nếu actualNumber nhận giá trị nào đó khác nil thì in ra giá trị của nó và ngược lại. Khi không thể ép kiểu qua string thì actualNumber sẽ mang giá trị nil và khi đó in ra …”

Implicitly Unwrapped Optionals
Bên trên mình có nói đến việc kiểu Int? thì sẽ trả về nil khi không thể ép kiểu được. Vậy nếu muốn gán một biến/hằng kiểu Int bằng một biến/hằng kiểu Int? hay String bằng String? thì sao?

 let possibleString: String? = "An optional string." let forcedString: String = possibleString! // Yêu cầu có dấu chấm than ở cuối let assumedString: String! = "An implicitly unwrapped optional string." let implicitString: String = assumedString // Không yêu cầu dấu chấm than 

Dấu chấm than (!) đóng vai trò như khẳng định. Nghĩa là bắt buộc phải gán 1 giá trị cho biến/hằng ngay khi nó được khởi tạo.
Dấu chấm hỏi (?) thì không yêu cầu phải gán giá trị khi khởi tạo.
Cả 2 đều giống nhau ở điểm là có thể chứa được giá trị nil

let assumedString: String = nil // lỗi, phải dùng String? hoặc String! let assumedString2: String = "" // chạy ok 

Kiểm soát lỗi (Error Handling)

Tương tự như các ngôn ngữ khác, Swift cũng có throws / try-catch để bẫy lỗi, kiểm soát lỗi.
Ví dụ:

func canThrowAnError() throws { // function này có thể có hoặc không có lỗi } 

Hoặc bạn cũng có thể bẫy lỗi rồi xuất ra màn hình hay lưu log ở đâu đó bằng cách dùng try-catch
Ví dụ:

 do { try canThrowAnError() } catch { } 

Bạn có thể tìm hiểu chi tiết hơn về Error Handling tại website của apple. Error Handling

Debugging with Assertions

Assertions trong Swfit đóng vai trò như là một trigger, nó sẽ tự động kiểm tra dữ liệu đầu vào và thông báo. Cách khai báo Assertion như sau:

assert(biểu thức toán tử trả về kiểu bool, thông báo xuất ra khi toán tử trả về false)

let age = -3 assert(age >= 0, "Tuổi của một người không thể nhỏ hơn 0") 

Nguồn dịch từ: The Swift Programming Language

Comments

comments