Khi học 1 ngôn ngữ mới, thì việc học, hiểu và biết cách sử dụng từ mới là điều bắt buộc với bất cứ ai. Ngôn ngữ Swift cũng vậy, nó cũng có những keywords mà chúng ta đều cần phải học và nắm vững để có thể lập trình iOS bằng ngôn ngữ Swift. Trong bài viết này mình xin phép được dịch lại 1 bài tổng hợp các từ khóa sử dụng trong Swift ở link sau: https://medium.com/the-traveled-ios-developers-guide/swift-keywords-v-3-0-1-f59783bf26c

Hy vọng bài viết này sẽ hưu ích cho những bạn đang học Swift và lập trình iOS.

Declaration Keywords

class: định nghĩa 1 kiểu giá trị, giúp chúng ta tổ chức và quản lý code thành những khối, nó có 1 số điểm khác struct như sau:

  • Tính kế thừa.
  • Cho phép ép kiểu hoặc check kiểu lúc chương trình chạy runtime.
  • Tính huỷ: cho phép instance của một class phải phóng bất cứ tài nguyên nào mà nó đã gán, hàm huỷ được gọi ngay trước khi instance của một class được giải phóng (trả lại bộ nhớ đã được cấp phát tới ram).
  • Class là kiểu tham chiếu, và chính vì nó là kiểu tham chiếu nên nó có thêm toán tử đồng nhất thức (===), có nghĩa rằng hai biến hoặc hằng của kiểu class tham chiếu tới chính xác cùng một instance của class.
class Person {
    var name:String
    var age:Int
    var gender:String
}

struct: cũng dùng để định nghĩa 1 kiểu giá trị giống class, tuy nhiên nó có 1 số điểm khác class như sau:

  • Không có tính kế thừa.
  • Là kiểu tham trị.
  • Không có tính huỷ.
struct Person {
    var name: String
    var age: Int
    var gender: String
}

enum: định nghĩa 1 tập hợp có số phần tử cố định và được liệt kê sẵn. Enum là kiểu tham trị.

enum Gender {
    case male
    case female
}

protocol: định nghĩa 1 giao thức. Class, struct hay enum mà adopt procotol này thì phải theo chuẩn của nó.

protocol Blog {
    var wordCount:Int { get set }
    func printReaderStats()
}

class TTIDGPost : Blog {
    var wordCount: Int
    
    init(wordCount: Int) {
        self.wordCount = wordCount
    }
    
    func printReaderStats() {
        //Print out some stats on the post
    }
}

extension: khai báo phần mở rộng của 1 class, struct, enum hoặc protocol.

class Person {
    var name:String = ""
    var age:Int = 0
    var gender:String = ""
}

extension Person {
    func printInfo() {
        print("My name is (name), I'm (age) years old and I'm a (gender).")
    }
}

import : cho phép nhúng framework, module khác vào file đang khai báo để sử dụng.

import UIKit
//All of UIKit's code is now available
class Foo {}

let: định nghĩa 1 hằng số và không thể thay đổi giá trị.

let constantString = "This cannot be mutated going forward"

var: định nghĩa 1 biến số và có thể thay đổi được giá trị.

var mutableString = ""
mutableString = "Mutated"

func: cho phép khai báo 1 hàm để thực hiện 1 chức năng nào đó.

func addNumbers(num1:Int, num2:Int) -> Int {
    return num1+num2
}

init: hàm khởi tạo, dùng để khởi tạo 1 instance của class, struct, hoặc enum để sử dụng.

class Person  {
    init() {
    //Set default values, prep for use, etc.
    }
}

deinit: được gọi ngay khi instance của 1 class được giải phóng vùng nhớ trong vùng nhớ heap.

class Person {
    var name:String
    var age:Int
    var gender:String
    
    deinit {
    // Giải phóng vùng nhớ trong heap.
    }
}

inout: các tham số của 1 hàm chỉ tồn tại trong phạm vi của hàm, tức là nó là 1 biến sao chép giá trị của giá trị truyền vào để sử dụng trong hàm đó và kết thúc hàm thì biến đó cũng được giải phóng. Tuy nhiên nếu tham số được khai báo inout thì nó sẽ tham chiếu đến giá trị truyền vào và những thay đổi trong hàm của giá trị đó vẫn còn khi hàm kết thúc. Khi gọi hàm phải đặt dấu (&) ngay trước tên biến để cho trình biên dịch biết biến đó có thể thay dổi trong hàm.

func swapInts(inout a: Int, inout _ b:Int) {  
    let temp = a       
    a = b        
    b = temp    
}

operator: các toán tử cho phép chúng ta kiểm tra, thay đổi hoặc kết hợp các giá trị lại với nhau.

let foo = 5
let anotherFoo = -foo 
let box = 5 + 3
let didPassCheckAll = didPassCheckOne && didPassCheckTwo
// Toán tử 3 ngôi giúp code ngắn hơn
let isLegalDrinkingAgeInUS = age >= 21 ? true : false

static: khai báo toàn cục. Biến khai báo static thì sẽ tồn tại suốt trong 1 chương trình mà không bị huỷ. Biến và hàm static có thể được truy cập trực tiếp từ Type (nếu khai báo trong Type) mà ko cần khởi tạo instance.

class Person {
    var jobTitle: String?
    static func assignRandomName(_ aPerson: Person) {
        aPerson.jobTitle = "Some random job"
    }
}
let somePerson = Person()
Person.assignRandomName(somePerson)
//somePerson.jobTitle is now "Some random job"

subscript: cho phép truy xuất đến 1 thành viên nằm trong một collection, list hoặc sequence.

var postMetrics = ["Likes":422, "ReadPercentage":0.58, "Views":3409]
let postLikes = postMetrics["Likes"]

typealias: đặt 1 tên khác của 1 kiểu sẵn có.

typealias JSONDictionary = [String: AnyObject]
func parseJSON(_ deserializedData: JSONDictionary){}

associatedtype: cho phép tạo 1 tên bất kỳ cho 1 loại biến trong khai báo của 1 protocol. Biến này được qui định là loại nào khi protocol đó được adopt.

protocol Entertainment {
    associatedtype MediaType
}

class Foo : Entertainment {
    typealias MediaType = String // Bất cứ loại nào đều được
}

Access Control Keywords

private: cho phép biến, hàm được sử dụng trong 1 scope chứa nó.

class Person {
    private var jobTitle = ""
}

extension Person {
    func printJobTitle() {
        print("My job is (jobTitle)")
        // Chỗ này sẽ compile lỗi vì jobTitle được gọi ngoài scope của class Person.
    }
}

fileprivate: giới hạn sử dụng trong 1 file, thường dùng kèm extension.

class Person {
    fileprivate var jobTitle:String = ""
}

extension Person {
    func printJobTitle() {
        print("My job is (jobTitle)")
        // nếu mà khai báo bằng private là compiler báo lỗi còn fileprivate thì không.
    }
}

internal : cho phép sử dụng trong 1 module, khi khai báo nếu không đi kèm 1 access control nào thì mặc định là internal.

class Person {
    internal var jobTitle:String = ""
}
let aPerson = Person()
aPerson.jobTitle = "This can set anywhere in the application"

public: cho phép truy cập bên ngoài module khai báo nhưng không thể kế thừa (subclassable) hay ghi đè (overridden) bên ngoài module.

public var foo: String? 

open: cho phép truy cập và có thể kế thừa hay ghi đè bên ngoài module khai báo.

open var foo: String?