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.