Bài 19: Subscripts trong swift - Lập trình Swift cơ bản

Đăng bởi: Admin | Lượt xem: 2096 | Chuyên mục: Swift


Khái niệm

Subscript được hiểu  là một lối tắt để truy xuất thành viên trong một danh sách, trình tự hay một tập hợp. Lập trình viên hoàn toàn có thể sử dụng subscript để thiết lập và truy xuất giá trị từ các thay vì sử dụng những phương thức riêng biệt để thiết lập và truy xuất.

Cú pháp

Tham khảo ví dụ dưới đây để hiểu rõ hơn nhé.
subscript(index: Int) -> Int {
    get {
      // return an appropriate subscript value here
    }
    set(newValue) {
      // perform a suitable setting action here
    }
}

Kiểu của newValue phải giống với kiểu trả về của subscript.

Khác với  instance method thì subscript có thể đọc viết hoặc chỉ đọc.
Ví dụ:
struct TimesTable {
    let multiplier: Int
    subscript(index: Int) -> Int {
        return multiplier * index
    }
}
let threeTimesTable = TimesTable(multiplier: 3)
print("six times three is \(threeTimesTable[6])")
// Prints "six times three is 18"

Cách sử dụng

Công dụng của subscript là sử dụng để truy xuất các thành viên trong một danh sách,tập hợp hay một trình tự. Bạn hoàn toàn có thể  thực hiện subscript  cho tính năng của class hoặc struct cụ thể của bạn.
Ví dụ:
Kiểu Dictionary của Swift, thực thi một subscript để thiết lập và truy xuất giá trị lưu trữ bên trong một thể hiện của Dictionary. Bạn có thể truy xuất giá trị của dictionary bằng việc cung cấp key của từ khóa của dictionary và gán giá trị cho một subscript.

Subscript option

Subscript có thể lấy cũng như trả về bất kỳ dữ liệu hay những tham số nào . Ngoài ra, Subscript có thể sử dụng variable parameters và variadic parameters, nhưng không thể sử dụng in-out parameters hoặc cung cấp giá trị mặc định cho tham số.

Một class hoặc struct có thể cung cấp nhiều subscript khác nhau để thực thi khi nó cần. Đối với những subscript thích hợp sẽ được sử dụng sẽ suy luận dựa trên kiểu của giá trị của subscript tại điểm mà subscript được sử dụng. Theo ví dụ bên dưới định nghĩa một cấu trúc Matrix, đại diện cho ma trận 2 chiều cho kiểu giá trị Double. Subscript của cấu trúc Matrix có 2 tham số kiểu int như sau:
struct Matrix {
     let rows: Int, columns: Int
     var grid: [Double]
     init(rows: Int, columns: Int) {
	self.rows = rows
	self.columns = columns
	grid = Array(count: rows * columns, repeatedValue: 0.0)
     } 
     func indexIsValidForRow(row: Int, column: Int) -> Bool {
	return row >= 0 && row < rows && column >= 0 && column < columns
     }
     subscript(row: Int, column: Int) -> Double {
     get {
        assert(indexIsValidForRow(row, column: column), "Index out of range")
       	return grid[(row * columns) + column]
     }
     set {
	assert(indexIsValidForRow(row, column: column), "Index out of range")
	grid[(row * columns) + column] = newValue
     }
    }
}
Để lấy được 2 tham số row và col thì Matrix phải cung cấp một trình khởi tạo và từ đó tạo một array đủ lớn để lưu trữ giá trị row * col kiểu Double. Mỗi vị trí trong Matrix được cho giá trị khởi tạo là 0.0. Để đạt được điều này thì kích thước của mảng và giá trị ô khởi tạo của 0.0 được thông qua bởi một trình khởi tạo mảng, để tạo và khởi tạo một mảng mới với kích thước chính xác.
Bài tiếp theo: Inheritance trong swift >>
vncoder logo

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!