12/08/2018, 17:13

Các Keyword cơ bản trong lập trình Swift

Hôm nay mình xin viết một phần về một số từ khoá cơ bản trong lập trình Swift. Ở phần này mình sẽ viết về các keywords liên quan tới việc khai báo hàm, thuộc tính, lớp ... Declaration Keywords let let: định nghĩa 1 biến bằng let là sau này không có thay đổi giá trị nó được đó. let ...

Hôm nay mình xin viết một phần về một số từ khoá cơ bản trong lập trình Swift. Ở phần này mình sẽ viết về các keywords liên quan tới việc khai báo hàm, thuộc tính, lớp ...

Declaration Keywords

let

let: định nghĩa 1 biến bằng let là sau này không có thay đổi giá trị nó được đó.

let constantString: String = "Khong the thay doi gia tri duoc"
constantString = "String moi" // Báo lỗi

var

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

var number: Int = 1
number = 2

func

func: cho phép khai báo 1 phương thức, chứa một khối lệnh nhằm làm một nhiệm vụ nào đó.

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

import :

import: cho phép nhúng 1 framework hoặc 1 module khác vào trong module hiện có.

import UIKit
/ /Tất cả các hàm trong UIKit đều có thể dùng trong file khai báo
class Foo {}

init

init: là quá trình chuẩn bị một instance của class, struct, hoặc enum để sử dụng.

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

deinit

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

class Person {
    var name: String
    var age: Int
    var gender: String
    deinit {
        // Deallocated
    }
}

associatedtype:

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 Add {
    associatedtype NumberType
}
class Math: Add {
    typealias NumberType = Int //Có thể là kiểu khác ở đây (Double, Float, ...)
}

typealias

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

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

extension

extension: cho phép mở rộng thêm hàm từ 1 class hoặc struct hoặc 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).")
    }
}

inout

inout: Tham số chỉ tồn tại trong phạm vi của hàm, nên sử dụng inout sẽ giúp thay đổi giá trị của một tham số của hàm và sự thay đổi đó 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    
}

var wifeMoney: Int = 0
var myMoney: Int = 1000

print(wifeMoney) // 0
print(myMoney) // 1000

// Tới cuối tháng.
swapInts(&myMoney, &wifeMoney)
    
print(wifeMoney) // 1000
print(myMoney) // 0

internal

internal: Một access control cho phép sử dụng trong 1 module, không ghi gì thì mặc định là internal.

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

open

open: Một access control cho phép object được sử dụng ở ngoài module khác . Thường viết bằng open khi tạo ra các framework.

open var foo: String? 

operator

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 number1 = 10
let number2 = -number1 
let number3 = 5 + 3

// "các toán tử kết hợp, liên kết các giá trị với nhau."

if myGirlFriend.isBeautiful && myGirlFriend.isIntelligent && myGirlFriend.isRich {
    // "Nhân vô thập toàn, thế nên bạn gái nào mà xinh đẹp, thông minh, giàu có
    // thì chắc chắn sẽ không có được tôi :]] ."
} else {
    //...
}

// "Toán tử 3 ngôi giúp code ngắn hơn."
let checkNumber3_IsOdd = (number3 % 2 == 0) ? false : true

private

private: Một access control cho phép chỉ xài trong 1 scope.

class Person {
    private var jobTitle = ""
}

extension Person {
    func printJobTitle() {
        print("My job is (jobTitle)") // Chỗ này sẽ compile lỗi
    }
}

fileprivate

fileprivate: là 1 access control giới hạn trong 1 file, thường dùng cho 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
    }
}

protocol

protocol: định nghĩa các 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
    }
}

public

public: Một access control cho phép object sử dụng ở tất cả các file trong cùng 1 module.

public var foo:String? //This can be overriden and accessible anywhere inside of the app, but not outside of it.

static

static: biến nào mà được định nghĩa bằng từ khoá static thì nó tồn tại suốt trong 1 chương trình và không bị huỷ, ngoài ra sử dụng static thì ta có thể thao tác biến hoặc hàm bằng class hoặc struct hoặc enum đó luôn.

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"

class

class: Dùng để tạo ra lớp là một nhóm các đối tượng mà có các thuộc tính chung. Nó có 1 số điểm khác với struct như sau:

  • Có thể kế thừa các thuộc tính và tình năng từ một class khác.
  • Có thể ép kiểu về class mà nó kế thừa.
  • Có thể giải phóng tài nguyên khi nó không còn sử dụng nữa.
  • Có thể có nhiều tham chiếu tới một class đã được khỏi tạo.
class Person {
    var name: String
    var age: Int
    var gender: String
}

struct

struct: cũng là thành phần không thể thiếu trong mọi ứng dụng như class, chúng 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 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

enum: Định nghĩa một nhóm các phần tử có liên quan và được liệt kê sẵn.

    enum Gender {
    case male
    case female
}

subscript

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"]
0