07/09/2018, 15:41

Cơ bản với Swift Phần 2

Tiếp theo với Cơ bản với Swift Phần 1 Phần 2 bao gồm: Type Safety và Type Inference Cách viết số (Numeric Literals) Bí danh kiểu dữ liệu (Type Aliases) Kiểu Bool Tuples Swift là một ngôn ngữ hỗ trợ kiểu an toàn (Type Safe, bắt đầu từ đây mình ghi Type Safe luôn vì dịch ra sẽ ...

Swift Basic

Tiếp theo với Cơ bản với Swift Phần 1
Phần 2 bao gồm:

  • Type Safety và Type Inference
  • Cách viết số (Numeric Literals)
  • Bí danh kiểu dữ liệu (Type Aliases)
  • Kiểu Bool
  • Tuples

Swift là một ngôn ngữ hỗ trợ kiểu an toàn (Type Safe, bắt đầu từ đây mình ghi Type Safe luôn vì dịch ra sẽ không sát và không hay lắm). Vì thế một ngôn ngữ Type Safe luôn khuyến khích bạn chỉ ra rõ ràng là bạn đang làm việc với kiểu dữ liệu nào. Ví dụ như một đoạn code bạn đang xử lí kiểu chuỗi (string), thì bạn sẽ không thể coi nó như là 1 số nguyên (int) được.

Vì Swift là một ngôn ngữ Type Safe, vì thế complier sẽ tự động kiểm tra kiểu dữ liệu và bắt lỗi giúp bạn. Điều đó sẽ giúp bạn dễ dàng hơn trong việc fix những lỗi này ngay trong thời gian đang phát triển.

Vì complier sẽ kiểm tra kiểu dữ liệu ở các biến cũng như hằng khi bạn gán một kiểu dữ liệu khác với kiểu dữ liệu mà biến / hằng đang lưu trữ và sẽ báo lỗi. Nếu trong lúc khai báo biến / hằng, bạn không định nghĩa trước biến / hằng đó chứa kiểu dữ liệu gì, thì Swift sẽ sử dụng Type Inference để tự động định nghĩa giúp bạn từ dữ liệu ban đầu mà bạn gán cho nó.
Ví dụ

    let meaningOfLife = 42
    // meaningOfLife sẽ mang kiểu Int

Tuy nhiên, có một lưu ý nho nhỏ là Swift ưu tiên sử dụng kiểu Double hơn là kiểu Float
Ví dụ

let pi = 3.14159
// pi sẽ mang kiểu dữ liệu là Double
  • Với số kiểu decimal, có thể viết dưới dạng không có tiền tố (prefix)
  • Với kiểu binary, tiền tố sẽ là 0b
  • Với kiểu octal, tiền tố sẽ là 0o
  • Với kiểu hexadecimal, tiền tố sẽ là 0x

Tất cả các số dưới đây đều có giá trị 17 ở kiểu decimal

let decimalInteger = 17
let binaryInteger = 0b10001     
let octalInteger = 0o21       
let hexadecimalInteger = 0x11  

Ngoài ra, với số mũ ở dạng decimal. Bạn có thể viết như sau:
1.25e2 có nghĩa là 1.25 * 10^2 = 125.0
1.25e-2 có nghĩa là 1.25 * 10^-2 = 0.0125

Tương tự với hexadecimal
0xFp2 có nghĩa là 15 * 2^2 = 60
0xFp-2 có nghĩa là 15 * 2^-2 = 3.75

Chuyển đổi số nguyên
Các bạn xem ví dụ dưới đây:

 let cannotBeNegative: UInt8 = -1
 // Kiểu Unit8 không thể chứa số âm, vì thế sẽ báo lỗi ở đây
 let tooBig: Int8 = Int8.max + 1
 // Tương tự ở đây với kiểu Int8 không thể chứa 1 số lớn hơn kiểu dữ liệu mà nó cho phép
 // Và vì thế cũng sẽ báo lỗi

Vậy để chứa 1 số lớn hơn kiểu dữ liệu hiện tại khi cộng 2 số thì sao?
Có thể làm như sau:

let twoThousand: UInt16 = 2_000
let one: UInt8 = 1
let twoThousandAndOne = twoThousand + UInt16(one)

Đó là lợi dụng Type Inference của Swift, ta chuyển 2 số cần cộng lại về cùng 1 kiểu dữ liệu, như ở trên là UInt16. Sau đó tạo 1 hằng(biến) mới để cộng lại. Khi đó, Swift sẽ hiểu là kiểu dữ liệu của hằng(biến) mới sẽ mang kiểu dữ liệu nào để phù hợp với kết quả của phép cộng.

Chuyển đổi số nguyên và số thập phân
Các bạn xem ví dụ bên dưới
Ví dụ:

let three = 3
let pointOneFourOneFiveNine = 0.14159
let pi = Double(three) + pointOneFourOneFiveNine
// pi sẽ mang giá trị 3.14159, và kiểu dữ liệu sẽ là Double

Hoặc ta có thể lấy phần nguyên của 1 số thập phân tương tự như trong C như sau:

let IntPi = Int(3.14159)
// IntPi mang giá trị là 3 và kiểu Int

Type Aliases sẽ là một tên bí danh cho một kiểu dữ liệu hiện tại. Hiểu đơn giản là đặt một cái tên khác cho một kiểu dữ liệu đang có.

typealias DayLaKieuInt32 = UInt32

Đơn giản vậy thôi :smile: lâu lâu đặt tên một kiểu dữ liệu nào đó bá đạo để giải trí cũng được đấy chứ.

Kiểu Bool này đã quá quen thuộc với tất cả mọi developer rồi nhỉ, kiểu bool sẽ mang giá trị là true hoặc false.
Tuy nhiên, Swift hơi khó tính 1 chút, không có dễ dãi giống như trong C. Bạn có thể xem ví dụ bên dưới để xem nó khó tính kiểu gì nhé.

let PQT_Handsome = true
if PQT_Handsome
{
    print ("PQT Handsome")
}
//Mọi thứ hoạt động tốt, không có error, không warning

Tuy nhiên

let PQT_Handsome = 1
if PQT_Handsome
{
    // Complier sẽ báo lỗi ngay lập tức, hơi khó tính nhỉ :(
}
// Nhưng có thể làm như sau
if PQT_Handsome == 1
{
    // Ồ, mọi thứ ok rồi
}

Đây là một điểm khá hay ở Swift, Tuples sẽ giúp bạn trả về 2 hay nhiều thứ từ một hàm, điểm này mình nghĩ một số ngôn ngữ khác nên học tập :smile:
Ví dụ:

let TenTuoiNghe = ("Pham Quoc Thang", 18, "Sinh Vien")
// TenTuoiNghe sẽ mang kiểu dữ liệu (String, Int, String)

Để lấy dữ liệu bạn cần từ Tuples trên, bạn có thể làm như sau.

let TenTuoiNghe = ("Pham Quoc Thang", 18, "Sinh Vien")
let (Ten, Tuoi, Nghe) = TenTuoiNghe

Hoặc nếu muốn lấy 1 hay vài thứ từ Tuples trên, còn lại không quan tâm thì có thể làm như sau

let TenTuoiNghe = ("Pham Quoc Thang", 18, "Sinh Vien")
let (Ten, _, _) = TenTuoiNghe
// Ten sẽ mang giá trị Pham Quoc Thang và còn lại thì bỏ qua hết

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

0