Các kiến thức cơ bản

Swift là một ngữ lập trình mới trong việc phát triển ứng dụng dành cho các hệ điều hành iOS, macOS, watchOs và tvOS. Dù sao thì một số phần của Swift sẽ thân thuộc với kinh nghiệm của bạn với ngôn ngữ C và Objective-C.

Swift có những phần cơ bản (fundamental) của C và Objective-C, bao gồm Int cho kiểu số nguyên (integer), DoubleFloat dành cho kiểu số có dấu chấm phẩy động (số thực), Bool dành cho kiểu giá trị luận lý (đúng/sai), và String dành cho kiểu dữ liệu chuỗi. Swift đồng thời cũng cung cấp những phần nâng cao của ba loại kiểu dữ liệu, đó là Array, SetDictionary, được mô tả cụ thể ở phần Kiểu danh sách - Collection types.

Cũng giống như ngôn ngữ C, Swift sử dụng các biến (variable) để lưu và tham chiếu đến giá trị bằng cách sử dụng tên. Swift đồng thời cũng có hằng số (constant) và mạnh hơn so với hằng số ở trong C. Hằng số được sử dụng xuyên suốt trong Swift để khiến code an toàn hơn và sạch sẽ hơn khi bạn làm việc với các giá trị mà không cần thay đổi.

Ngoài những kiểu có ở C và Objective-C, Swift cũng giới thiệu kiểu nâng cao mà không có ở Objective-C, ví dụ như kiểu tuple (bộ, tập hợp). Tuple cho phép bạn tạo và nhóm các giá trị với nhau. Bạn có thể sử dụng tuple để trả về nhiều giá trị từ một hàm như một giá trị hợp.

Swift cũng giới thiệu kiểu Optional (giá trị không bắt buộc) nhằm mục đích xử lý những giá trị bị thiếu. Optional có thể hiểu một trong hai, một là "có một giá trị, và nó bằng x" hai là "chằng có giá trị nào cả". Sử dụng Optional cũng giống như việc sử dụng con trỏ nil ở trong Objective-C, tuy nhiên nó lại có thể hoạt động với mọi kiểu chứ không chỉ với các lớp. Optional trong Swift không chỉ an toàn và súc tích hơn con trỏ nil ở trong Objective-C, mà nó còn là trái tim của rất nhiều tính năng hữu ích của Swift.

Swift là một ngôn ngữ an toàn kiểu (type-safe), điều này có nghĩa rằng ngôn ngữ Swift giúp bạn hiểu rõ hơn về kiểu của giá trị mà code của bạn có thể làm việc được. Nếu câu lệnh của bạn mong đợi một chuỗi String, an toàn kiểu sẽ giúp bạn tránh khỏi việc nhầm lẫn truyền vào một kiểu số nguyên Int. Tương tự như vậy, an toàn kiểu giúp bạn tránh khỏi những lỗi truyền một kiểu optional String vào đoạn code mà đúng ra phải là kiểu nonoptional String (kiểu String chứ không phải kiểu Optional String). An toàn kiểu cũng giúp bạn bắt và xử lý lỗi sớm, ngay ở giai đoạn phát triển.

Hằng số và biến (Constant and Variable)

Hằng số và biến kết hợp giữa tên (chẳng hạn như maximumNumberOfLoginAttempts hay welcomeMessage) với một giá trị của một kiểu nhất định (chẳng hạn như số 10 hay chuỗi "Hello"). Giá trị của hằng số (constant) không thể thay đổi một khi nó đã được gán giá trị, ngược lại, giá trị của một biến (variable) có thể được gán một giá trị khác trong tương lai.

Khai báo hằng số và biến

Hằng số và biến cần phải được khai báo trước khi được sử dụng. Bạn có thể khai báo một hằng số bằng từ khoá letvar khi khai báo một biến. Dưới đây là một ví dụ về cách hằng số và biến được sử dụng để lưu lại số lần thử (attempt) đăng nhập của một người dùng:

let maximumNumberOfLoginAttempts = 10
var currentLoginAttempt = 0

Câu lệnh phía trên có thể đọc hiểu là: "Khai báo một hằng số có tên là maximumNumberOfLoginAttempts, và gán cho nó một giá trị bằng 10. Sau đó, khai báo một biến có tên là currentLoginAttempt và gán giá trị ban đầu của nó bằng 0."

Ở ví dụ này, số lần cho phép thử đăng nhập tối đa vào hệ thống được khai báo là một hằng số, bởi vì giá trị tối đa (maximum) sẽ không bao giờ thay đổi. Số lần thử đăng nhập đến thời điểm hiện tại (current) được khai báo là một biến, bởi vì giá trị này có thể tăng lên mỗi khi thử đăng nhập không thành công.

Bạn có thể khai báo nhiều hằng số hay biến trên cùng một dòng, và được ngăn cách bởi các dấu phẩy (comma):

var x = 0.0, y = 0.0, z = 0.0

Chú thích
Nếu code của bạn lưu một giá trị mà không có ý định thay đổi giá trị trong tương lại, hãy nhớ luôn luôn sử dụng hằng số với từ khoá là let. Chỉ sử dụng biến khi lưu giá trị có thể bị thay đổi sau đó bằng cách sử dụng từ khoá var.

Chú thích kiểu (Type annotation)

Bạn có thể cung cấp một chú thích kiểu khi bạn khai báo một hằng số hoặc biến, để chỉ rõ ra rằng loại giá trị mà hằng số hoặc biến có thể lưu giá trị. Để chú thích kiểu, chúng ta viết dấu hai chấm ngay sau tên của hằng số hoặc biến, tiếp đến là tên của kiểu mà chúng ta muốn sử dụng.

Ví dụ dưới đây cung cấp một chú thích kiểu cho biến có tên là welcomeMessage, để chỉ ra rằng biến đó có thể lưu giá trị kiểu String:

var welcomeMessage: String

Dấu hai chấm ở phần khai báo có nghĩa là "...có kiểu là...,", do vậy, câu lệnh phía trên có thể đọc là:

"Khai báo một biến có tên là welcomeMessage có kiểu là String".

Câu "có kiểu là String" có nghĩa rằng "có thể lưu bất kỳ giá trị String nào.". Hay còn có thể hiểu rằng "kiểu dữ liệu có thể lưu giá trị".

Biến welcomeMessage bây giờ có thể gán với bất kỳ chuỗi nào mà không hề bị lỗi:

welcomeMessage = "Hello"

Bạn có thể định nghĩa nhiều biến có cùng kiểu trên cùng một dòng, và được ngăn cách bằng các dấu phẩy, như sau:

var red, green, blue: Double

Chú thích
Trong thực tế, hiếm khi bạn cần phải viết chú thích kiểu. Nếu bạn cung cấp một giá trị ban đầu cho hằng số hay biến ngay tại thời điểm khai báo, Swift hầu như luôn có thể suy (infer) được kiểu được sử dụng cho hằng số hoặc biến, như được mô tả chitieets ở phần An toản kiểu và suy kiểu - Type safety and Type Inference </i>. Ở ví dụ welcomeMessage phía trên, không có giá trị ban đầu nào được cung cấp, do vậy kiểu của biến welcomeMessage cần phải được chỉ ra bằng cách sử dụng chú thích kiểu hơn là để cho Swift tự suy kiểu mà không hề có giá trị ban đầu.

Đặt tên cho hằng số và biến

Tên của hằng số và biến có thể là bất cứ ký tự nào, bao gồm cả các ký tự Unicode:

let π = 3.14159
let tên = "Khả Chương"
let 🐶🐮 = "dogcow"

Tên của hằng số hoặc biến không thể chưa ký tự cách, các ký tự toán học, mũi tên. Chúng cũng không thể bắt đầu bằng một số, mặc dù số có thể có ở trong tên của hằng số hoặc biến.

Một khi bạn khai báo hằng số hay biến với một kiểu nhất định, bạn không thể định nghĩa lại chúng với cùng tên, hay thay đổi chúng để lưu một giá trị có kiểu khác. Bạn cũng không thể thay đổi một hằng số thành biến hoặc ngược lại.

Chú thích
Nếu bạn muốn đặt tên của hằng số hoặc biến trùng với từ khoá đã có trong Swift, bạn có thể bao quanh tên bằng dấu nháy (`). Tuy nhiên bạn cũng nên tranh sử dụng tên trùng với các từ khoả, trừ khi bạn không còn lựa chọn nào.

Bạn có thể thay đổi giá trị của biến đã được tồn tại bằng giá trị của một biến có kiểu phù hợp. Ở ví dụ dưới đây, giá trị của biến friendlyWelcome bị thay đổi từ "Hello!" thành "Bonjour!":

var friendlyWelcome = "Hello!"
friendlyWelcome = "Bonjour!"
// giá trị của biến friendlyWelcome bây giờ là "Bonjour!"

Không giống như biến, giá trị của hằng số không thể thay đổi một khi nó đã được gán. Nếu bạn thử thay đổi giá trị của hằng số, bạn sẽ nhận được lỗi khi code được biên dịch:

let languageName = "Swift"
languageName = "Swift++"
// Lỗi này là lỗi lúc biên dịch (compile-time): giá trị của languageName không thể bị thay đổi

In ra giá trị hằng số và biến

Bạn có thể in ra giá trị hiện tại của hằng số hoặc biến với hàm print(_:separator:terminator:) :

print(friendlyWelcome)
// Sẽ in ra kết quả là: "Bonjour!"

Hàm print(_:separator:terminator:) làm một hàm toàn cục (global function) cho phép in ra một hoặc nhiều giá trị. Ở trong Xcode, ví dụ, hàm print(_:separator:terminator:) in ra kết quả ở mục "console". Tham số separatorterminator có các giá trị mặc đinh, bạn có thể bỏ qua chúng khi bạn gọi hàm này. Mặc định, hàm này sẽ kết thúc dòng được in ra bằng một dấu xuống dòng. Để in ra giá trị mà không bị xuống dòng, hãy truyền một chuỗi rỗng như là tham số terminator - ví dụ: print(someValue, terminator: ""). Chi tiết về các tham số mặc đinh, hãy xem phần Giá trị mặc định của tham số.

Để có thể in giá trị của biến hoặc hằng số, Swift sử dụng phép suy chuỗi, bao quanh tên của biến hoặc hằng số là dấu () và đằng trước nó là dấu </code>\</code>.

print("The current value of friendlyWelcome is \(friendlyWelcome)")
// Sẽ in ra kết quả là: The current value of friendlyWelcome is Bonjour!

Chú thích
Tất cả tuỳ chọn bạn có thể dụng với phép suy chuỗi được mô tả ở phần Suy chuỗi.

Chú thích (Comments)

Sử dụng các chú thích (comment) để thêm các nội dung không thể thực thi trong đoạn code của bạn, như một mẩu ghi chú hay nhắc nhở chính bạn. Các chú thích được bỏ qua bởi trình biên dịch Swift khi code của bạn được biên dịch.

Chú thích trong swift rất giống với chú thích trong C. Chú thích trên một dòng được bắt đầu với hai dấu gạch //:

// This is a comment.

Chú thích trên nhiều dòng được bắt đầu với /* và kết thúc với */:

/* This is also a comment
but is written over multiple lines. */

Không giống như chú thích nhiều dòng ở ngôn ngữ C, chú thích nhiều dòng ở ngôn ngữ Swift có thể lồng vào các chú thích nhiều dòng khác. Bạn viết chú thích lồng nhau bằng cách bắt đầu với một khối chú thích nhiều dòng và sau đó bắt đầu viết chú thích nhiều dòng thứ hai nằm trong khối chú thích thứ nhất. Khối chú thích thứ hai sau đó được đóng lại, dưới đây là khối chú thích thứ nhất:

/* This is the start of the first multiline comment.
/* This is the second, nested multiline comment. */
This is the end of the first multiline comment. */

Chú thích nhiều dòng lồng nhau cho phép bạn chú thích một khối code lớn nhanh và dễ dàng, thậm chí nếu đoạn code thực sự đã chứa các chú thích nhiều dòng.

Dấu chấm phẩy (Semicolons)

Không giống như các ngôn ngữ khác, Swift không yêu cầu bạn viết dấu chấm phẩy ; ở cuối mỗi câu lệnh, mặc dù bạn vẫn có thể thực hiện điều đó. Tuy nhiên, dấu chấm phẩy được yêu cầu khi bạn muốn viết nhiều câu lệnh trên cùng một dòng:

let cat = "😺"; print(cat)
// In ra: 😺

Số nguyên (Integer)

Số nguyên là số không có phần thập phân, ví dụ như 42-23. Số nguyên có thể là số nguyên có dâu signed (nguyên dương, 0 hoặc nguyên âm) hoặc số nguyên không dấu unsigned (nguyên dương hoặc 0).

Swift cung cấp các số nguyên có dấu và không dấu dưới dạng 8, 16, 32, 64 bit. Các số nguyên này tuân thủ theo quy tắc đặt tên (naming convention) từ ngôn ngữ C, một số nguyên không dấu 8 bit thì thuộc kiểu UInt8, và một số nguyên có dấu 32 bit thì thuộc kiểu Int32. Giống như tất cả các kiểu trong Swift, các kiểu số nguyên đều có tên viết hoa.

Phạm vi của số nguyên

Bạn có thể truy cập vào giá trị nhỏ nhất (minimum) và lớn nhất (maximum) của mỗi loại số nguyên với thuộc tính minmax.

let minValue = UInt8.min //minValue bằng 0, và thuộc kiểu UInt8
let maxValue = UInt8.max //maxValue bằng 255, và thuộc kiểu UInt8

Các giá trị của các thuộc tính này là độ lớn tương ứng của các kiểu (ví dụ như UInt8 ở ví dụ phía trên), và được sử dụng ở trong các biểu thức cùng với giá trị có cùng kiểu.

Int

Ở phần lớn các trường hợp, bạn không cần chọn một độ lớn cụ thể cho số nguyên mà bạn sử dụng trong code của bạn. Swift cung cấp thêm một số nguyên thuộc kiểu Int, mà có cùng kích thước với các nền tảng hệ điều hành hiện tại:

  • Ở nền tảng 32 bit (32-bit platform), Int có kích thước giống với Int32.
  • Ở nền tảng 64 bit (64-bit platform), Int có kích thước giống với Int64.

Bạn nên sử dụng Int đối với các giá trị nguyên trong code của bạn, trừ khi bạn cần làm việc với một số nguyên có kích thước cụ thể. Điều này khiến cho code của bạn có tính nhất quán. Thậm chí đối với nền tảng 32 bit, Int có thể lưu giá trị trong khoảng -2,147,483,6482,147,483,647, nó đủ lớn để lưu các giá trị nguyên.

UInt

Swift đồng thời cũng cung cấp một kiểu số nguyên không dấu, UInt mà có cùng kích thước với các nền tảng hệ điều hành hiện tại:

  • Ở nền tảng 32 bit (32-bit platform), UInt có kích thước giống với UInt32.
  • Ở nền tảng 64 bit (64-bit platform), UInt có kích thước giống với UInt64.

Chú thích
Bạn chỉ nên sử dụng kiểu UInt khi bạn cần chỉ rõ ra số nguyên đó là số nguyên dương với cùng kích thước của nền tảng mà ứng dụng sẽ chạy. Ngược lại, bạn nên sử dụng kiểu Int, thậm chí dùng cả đối với số nguyên không âm. Việc sử dụng kiểu Int giúp chúng ta có thể tránh khỏi việc chuyển đổi kiểu giữa các số. Tham khảo thêm ở phần An toàn kiểu và suy luận kiểu .

Số dấu phẩy động (Floating-Point number)

Các số có dấy phẩy động là các số có phần phân số, chẳng hạn như 3.14159, 0.1-273.15. Kiểu dấu phẩy động có thể thể hiện được khoảng giá trị lớn hơn kiểu số nguyên, và có thể chứa được các số lớn hơn hoặc nhỏ hơn so với Int. Swift cung cấp hai kiểu dấu phẩy động có dấu:

  • Double thể hiện cho một số có dấu phẩy động 64 bit
  • Float thể hiện cho một số có dấu phẩy động 32 bit

Chú thích
Kiểu Double có độ chính xác đến 15 chữ số phần thập phân, trong khi kiểu Float chính xác đến 6 chữ số phần thập phân. Tuỳ thuộc và nhu cầu của bạn khi sử dụng kiểu có dấu phẩy động, nó tuỳ thuộc vào phạm vi của giá trị mà bạn thực hiện trong code. Trong trường hợp cả hai đều đáp ứng được nhu cầu của bạn thì bạn nên sử dụng kiểu Double.

An toàn kiểu và suy kiểu

Swift là một ngôn ngữ an toàn kiểu (type-safe). Một ngôn ngữ an toàn kiểu khuyến khích bạn tường minh kiểu của giá trị trong code của bạn. Nếu code của bạn mong muốn một kiểu String thì bạn sẽ không thể tình cờ truyền vào một giá trị kiểu Int được.

Do Swift là một ngôn ngữ an toàn kiểu, do vậy nó sẽ thực hiện kiểm tra kiểu khi biên dịch code của bạn và đánh dấu những kiểu không khớp được xem như là lỗi. Điều này cho phép bạn có thể nắm bắt và sửa lỗi sớm nhất có thể ngay ở quá trình phát triển.

Việc kiểm tra kiểu giúp bạn tránh khỏi những lỗi khi bạn làm việc với các kiểu khác nhau của các giá trị. Tuy nhiên, điều này không có nghĩa rằng bạn không cần nhất thiết phải định nghĩa tường minh kiểu dữ liệu cho từng hằng số và biến khi bạn khai báo chúng. Nếu bạn không chỉ rõ kiểu của giá trị mà bạn cần, Swift sẽ sử dụng suy luận kiểu (type inference) để tìm ra kiểu phù hợp nhất. Suy luận kiểu cho phép trình biên dịch tự động suy ra kiểu dữ liệu của một biểu thức nhất định khi nó biên dịch code của bạn, đơn giản là kiểm tra các giá trị mà bạn cung cấp.

Nhờ có suy luận kiểu, Swift giúp cho việc khai bao kiểu ít hơn so với các ngôn ngữ khác như C hay Objective-C. Hằng số và biến vẫn là có các kiểu tường minh, tuy nhiên phần lớn công việc khai báo kiểu đều được tự suy và bạn không cần phải khai bao kiểu.

Suy luận kiểu là một phần rất hữu ích khi bạn khai báo một hằng số hoặc biến với một giá trị ban đầu. Điều này thường xảy ra khi bạn gán một giá trị trực tiếp ngay lúc khai báo hằng số hay biến (Một giá trị trực tiếp là giá trị mà xuất hiện trực tiếp ngay trong code của bạn, chẳng hạn như 42 hay 3.14159 ở ví dụ dưới đây).

Chẳng hạn, nếu bạn gán một giá trị trực tiếp là 42 vào một hằng số mà không chỉ rõ ra kiểu của nó là gì, Swift sẽ tự suy ra kiểu mà bạn muốn cho hằng số đó, đó là một số nguyên có kiểu Int, bởi vì giá trị ban đầu của bạn trông giống như một số nguyên:

let meaningOfLife = 42
// Kiểu của hằng số meaningOfLife được suy ra là kiểu Int

Tương tự như vậy đối với giá trị có dấu phẩy động, Swift sẽ suy ra rằng bạn muốn tạo một hằng số kiểu Double:

let pi = 3.14159
// Kiểu của hằng số pi được suy ra là kiểu Double

Swift luôn luôn chọn Double hơn là Float khi suy kiểu đối với các số có dấu phẩy động.

Nếu giá trị trực tiếp của bạn là sự kết hợp vả số nguyên và số có dấu phẩy động ở trong cùng một biểu thức, thì Swift sẽ suy ra kiểu của nó là kiểu Double:

let anotherPi = 3 + 0.14159
// Kiểu của hằng số anotherPi được suy ra là kiểu Double

Giá trị trực tiếp bằng 3 không có một kiểu tường minh nên Swift sẽ suy ra kiểu của hằng số anotherPi sẽ là kiểu Double bằng cách dựa vào phần dấu phẩy động ở phần giá trị sau dấu cộng.

Chữ số

results matching ""

    No results matching ""