Các cách sử dụng AS, AS?, AS! một cách hiệu quả và an toàn trong code Swift


Chào các bạn, hôm nay chúng ta sẽ cùng nhau tìm hiểu rõ và chi tiết về các cách sử dụng các toán tử as, as?, as! trong Swift.
Các toán tử này cũng là một trong những yếu tố tạo nên tính an toàn trong code Swift. Nếu bạn hiểu rõ nó thì code của bạn sẽ rất an toàn, nếu không thì có thể gây ra bug và crash ứng dụng triền miên.


Để bắt đầu cho bài hướng dẫn này, các bạn nên sử dụng Xcode Playground để thực hành code theo các ví dụ trong bài, nó giúp bạn sẽ dễ hiểu và nhớ lâu hơn.
Trong bài này có một vài kiến thức về optional nếu bạn nào chưa hiểu về nó thì có thể tìm hiểu tại đây.

Trước tiên chúng ta sẽ tìm hiểu về 2 ký tự "?", "!":
Trong khai báo biến, ký tự “?” có nghĩa là ta nói rằng biến đó có khả năng bị nil chứ không phải lúc nào cũng có giá trị. Trong câu lệnh thông thường, dấu “?” xuất hiện báo hiệu rằng biến đó có thể bị nil và khi sử dụng biến đó mà biến đó bị nil thì app sẽ không bị crash.
Trong khai báo biến, khi dùng ký tự “!” có nghĩa là chúng cực kỳ chắc chắn rằng biến có “!” sẽ luôn luôn có giá trị. Nếu không có giá trị trong các biến đó thì khi sử dụng biến đó sẽ gây ra crash ứng dụng.

Lưu ý:
Khi chúng ta khai báo biến mà không biết biến này có giá trị hay không thì nên dùng ký tự "?" và ngược lại nếu biết biến luôn luôn có giá trị thì chúng ta sẽ dùng ký tự "!".
Ví dụ:

As sử dụng trong trường hợp chúng ta muốn ép kiểu(upcasting) dữ liệu nào đó thành một kiểu dữ liệu ta mong muốn.
Lưu ý:
Khi dùng As bạn phải chắc chắn một điều là kiểu dữ liệu bạn muốn ép kiểu cũng chính là kiểu dữ liệu của biến bạn đang muốn ép, nếu không sẽ xảy ra bug.
Ví du:



Tuy nhiên chúng ta có thể sử dụng cách ép kiểu an toàn bằng cách dùng toán tử sau:
As? Được dùng giống như As nhưng khác biệt ở chỗ là nếu trường hợp chúng ta ép kiểu không thành công nó sẽ trả về trị nil. Để hiểu rõ hơn chúng ta xem ví dụ sau:
Ví dụ:


As! Được dùng Giống như As vậy tuy nhiên nó sẽ bắt buộc biến của chúng ta muốn ép kiểu phải trở thành kiểu dữ liệu nào đó. Nếu trường hợp biến đó không thể ép về kiểu đó thì sẽ xảy ra crash ứng dụng ngay.
Lưu ý:
Sử dụng thèn này rất nguy hiểm, nếu không chắc chắn được rằng kiểu chúng ta muốn ép sẽ thành công thì sẽ gây ra crash ứng dụng. Nếu chúng ta cảm thấy không chắc chắn hay mơ hồ về việc ép kiểu dư liệu này thì chúng ta nên dùng as? Để bắt trường hợp không ép thành công và xử lý tiếp.
Ví dụ:


Ví dụ:


Lưu ý:
As! Cũng không thể ép kiểu dữ liệu nào đó thành kiểu optional.
As?As! Ngoài việc ép kiểu để tạo ra biến mới và sử dụng nó thì chúng còn có công dụng để kiểu tra xem biến đó có chính xác thuộc loại kiệu dữ liệu mà mình muốn kiểm tra hay không.
Nếu bạn ép kiểu thành công với as? Thì nó sẽ cho bạn một biến mới kiểu optional, ngược lại với as!, khi bạn ép kiểu thành công nó sẽ cho ra một biến bình thường.
Để hiểu hơn chúng ta sẽ tham khảo ví dụ bên dưới:
Ví dụ 1:

var optionalString = dict.objectForKey("SomeKey") as? String
optionalString Sẽ là một biến optional kiểu String?,
Nếu trường hợp chúng ta không ép kiểu thành kiểu dữ liệu String, có nghĩa là sẽ có trường hợp nào đó mà giá trị của dict.objectForKey("SomeKey") là một kiểu dữ liệu nào đó khác String thì khi đó dùng as? String sẽ ép kiểu không thành công thì biến optionalString sẽ được gián nil.
Ví dụ 2:
var optionalString = dict.objectForKey("SomeKey") as! String?
Trường hợp này thì bạn nói với hệ thống là kiểu dữ liệu của dict.objectForKey("SomeKey") là kiểu String?, chắc chắc là kiểu String?.
Nếu khẳng định trên của bạn là đúng thì chúng ta sẽ có một biến optionalString  với kiểu String?
Nhưng không may nếu khẳng định của bạn là sai, có nghĩa là dict.objectForKey("SomeKey") không phải là kiểu String?, thì sẽ xảy ra crash ngay lập tức.
Vậy giải pháp ở đây là chúng ta sẽ sử dụng cú pháp if let hay guard let… để kiểm tra kiểu dữ liệu của biến đó, nếu ta không chắc chắn.
Ví dụ:


Kết thúc phần này tuy không mấy khó hiểu nhưng nếu các bạn thực sự không nắm chắc và hiểu rõ về các từ khóa as, as?, as! thì khi sử dụng có thể gây ra crash ứng dụng một cách vô lý.
Nếu bạn nào chưa rõ nên thực hành các ví dụ bên trên với background để hiểu và nhớ lâu hơn các trường hợp nên dùng và không nên dùng các từ khóa trên.
Hy vọng các bạn thích và học được nhiều kiến thức từ bài viết này. Mong các bạn chia sẽ nó để mọi người cùng học và cùng trao đổi. Mọi thắc mắc hay trao đổi về bài viết, các bạn có thể để lại bình luận bên dưới mình sẽ hỗ trợ sớm nhất.

Chân thành cảm ơn các bạn đã theo dõi.

VHX.

Post a Comment

0 Comments