- Bài 1: Tổng quan ngôn ngữ Swift
- Bài 2: Hướng dẫn cài đặt Xcode và chạy một playground
- Bài 3: Những cú pháp cơ bản trong swift
- Bài 4: Kiểu dữ liệu
- Bài 5: Toán tử trong ngôn ngữ lập trình Swift
- Bài 6: Câu lệnh rẽ nhánh trong swift – Decision Making
- Bài 7: Chuỗi ký tự trong Swift - Character và String
- Bài 8: Vòng lặp trong swift – Loops
- Bài 9: Mảng Array trong swift
- Bài 10: Dictionary trong swift
- Bài 11: Optional trong Swift
- Bài 12: Functions trong swift
- Bài 13: Closure trong swift
- Bài 14: Enumeration trong swift
- Bài 15: Struct trong swift
- Bài 16: Classes trong swift
- Bài 17: Properties trong swift
- Bài 18: Methods trong swift
- Bài 19: Subscripts trong swift
- Bài 20: Inheritance trong swift
- Bài 21: Initialization trong swift
- Bài 22: Deinitialization trong swift
- Bài 23: ARC trong swift
- Bài 24: Type casting trong swift
- Bài 25: Extensions trong swift
- Bài 26: Protocols trong swift
- Bài 27: Generics trong swift
- Bài 28: Access control trong swift
Bài 11: Optional trong Swift - Lập trình Swift cơ bản
Đăng bởi: Admin | Lượt xem: 3149 | 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.
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!
- Bài 1: Tổng quan ngôn ngữ Swift
- Bài 2: Hướng dẫn cài đặt Xcode và chạy một playground
- Bài 3: Những cú pháp cơ bản trong swift
- Bài 4: Kiểu dữ liệu
- Bài 5: Toán tử trong ngôn ngữ lập trình Swift
- Bài 6: Câu lệnh rẽ nhánh trong swift – Decision Making
- Bài 7: Chuỗi ký tự trong Swift - Character và String
- Bài 8: Vòng lặp trong swift – Loops
- Bài 9: Mảng Array trong swift
- Bài 10: Dictionary trong swift
- Bài 11: Optional trong Swift
- Bài 12: Functions trong swift
- Bài 13: Closure trong swift
- Bài 14: Enumeration trong swift
- Bài 15: Struct trong swift
- Bài 16: Classes trong swift
- Bài 17: Properties trong swift
- Bài 18: Methods trong swift
- Bài 19: Subscripts trong swift
- Bài 20: Inheritance trong swift
- Bài 21: Initialization trong swift
- Bài 22: Deinitialization trong swift
- Bài 23: ARC trong swift
- Bài 24: Type casting trong swift
- Bài 25: Extensions trong swift
- Bài 26: Protocols trong swift
- Bài 27: Generics trong swift
- Bài 28: Access control trong swift