Bài 11: Optional trong Swift - Lập trình Swift cơ bản

Đăng bởi: Admin | Lượt xem: 2914 | Chuyên mục: Swift


Lời mở đầu 

Có lẽ công dụng tuyệt vời của Optional trong ngôn ngữ lập trình Swift đã không còn quá xa lạ, thậm chí còn rất quen thuộc đối với những lập trình viên nữa.
Optional được biết tới như một khái niệm mới trong ngôn ngữ lập trình Swift và được Apple công nhận là ngôn ngữ an toàn hơn rất nhiều so với ngôn ngữ lập trình trước đó- ngôn ngữ Objective-C. Ngoài ra, Optional sẽ giúp lập trình viên xử lý các trường hợp object không có giá trị.

Khai báo Optional

//Khai báo Integer Optional

var perhapsInt: Int?

//Khai báo String Optional

var perhapsStr: String?

//Khai báo Optional

var variableName: ValueType? 
Bạn có thể hiểu dạng giá trị hay ValueType ở đây là String, Integer, Float, hay 1 custom object ... Đối với ngôn ngữ lập trình Swift, các biến này sẽ được gán giá trị mà không được phép để nil hay còn gọi là dạng non-optional và trình biên dịch chắc chắn sẽ thông báo lỗi nếu như bạn gán giá trị nil cho các biến non-optional này. 
Bạn có tham khảo thêm ví dụ ở dưới đây để hiểu rõ hơn.
var str: String //compile error 

Biến str là kiểu String, kiểu non-optional nếu bạn không gán giá trị mặc định thì Xcode sẽ báo lỗi như sau:

var str: String = “Hello Swift” // OK

str = nil // biên dịch lỗi 

Như trên biến str có kiểu String, đây là kiểu non-optional nên ta phải gán giá trị mặc định cho nó là "Hello Swift", dòng bên dưới ta gán str = nil trong khi str là kiểu non-optional nên Xcode sẽ báo lỗi trong trường hợp này. Khai báo dạng optional:

var str: String? = “Hello Swift” // OK

str = nil // OK 

Forced Unwrapping

Nếu bạn đã chọn ra được một biến là tùy chọn thì để lấy giá trị từ biến này bạn sẽ cần unwrap (mở) chúng ra. Chúng ta sẽ làm thử một ví dụ đơn giản như sau: 
Giả  sử bạn muốn lấy giá trị từ biến được định nghĩa kiểu optional, bạn sẽ phải unwrap nó.
var msg: String? = "Hello Swift"
Biến msg là biến có kiểu dữ liệu “String?” . Có lẽ kiểu dữ liệu String thì ai cũng đã rõ cả rồi, vậy kiểu dữ liệu String? là gì? Bạn có thể hiểu nó chính là một wrap của kiểu String, String+nil nên 2 kiểu String và String? hoàn khác nhau. Nếu muốn lấy được giá trị của msg, bạn phải unwrap nó Chạy đoạn code sau: import Cocoa
var myString: String?

myString = "Hello, Swift!"

if myString != nil {

   println(myString)

} else {

   println("myString has nil value")

}

Ta sẽ nhận được output như sau:

Optional("Hello, Swift!")

Để lấy được giá trị thực của myString bạn cần force unwrap.

import Cocoa

var myString:String?

myString = "Hello, Swift!"

if myString != nil {

   println( myString! )

}else {

   println("myString has nil value")

}

Và chúng ta nhận được kết quả như sau:

Hello, Swift!
Trong một số trường hợp force unwrap là điều không nên do nó có thể gây crash app.
Automatic Unwrapping
Ví dụ:
import Cocoa

var myString:String!

myString = "Hello, Swift!"

if myString != nil {

   println(myString)

}else {

   println("myString has nil value")

}
Với ví dụ trên, biến myString được viết dưới dạng String! Và khi bạn gọi hàm println(myString) thì biến myString này sẽ tự động unwrap thành kiểu String

Optional Binding

Optional Binding dùng để check xem biến optional có giá trị hay không từ đó có thể đưa ra những xử lý kịp thời tránh crash app.
var myString:String?

myString = "Hello, Swift!"

if let yourString = myString {

   println("Your string has - \(yourString)")

}else {

   println("Your string does not have a value")

}

Kết quả:

Your string has - Hello, Swift!

Optional Chaining

Ví dụ sau:
class Stock = {

    var code: Sring?

    var price: Double?

}

if let stock = findStockCode(“Apple”) {

    if let sharePrice = stock.price {

        let totalPrice = sharePrice * 100

        println(totalPrice)

    }

}

func findStockCode(company:String) -> Stock? {

    if(company == “Apple”) {

        let appl: Stock = Stock()

        appl.code = “APPL”

        appl.price = 90.32

        return appl

    }else if (company == “Google”) {

        let goog: Stock = Stock()

        goog.code = “GOOG”

        goog.price = 90.32

        return appl

    }

    return nil

}
Ta có thể sử dụng optional chaining làm cho code ngắn gọn hơn như sau:
if let sharePrice = findStockCode(“Apple”)?.price {

    let totalPrice = sharePrice * 100

    println(totalPrice)

}
Mong rằng, với những thông tin cơ bản về một khái niệm mới trong ngôn ngữ lập trình Swift- Optional  mà tôi đã cung cấp ở phía trên sẽ giúp cho code của bạn an toàn khi check nil với các biến trước khi bắt đầu thực hiện bất kỳ một thao tác nào đó trên máy và giảm thiểu tối đa tình trạng app bị crash.
Bài tiếp theo: Functions trong swift >>
vncoder logo

Theo dõi VnCoder trên Facebook, để cập nhật những bài viết, tin tức và khoá học mới nhất!