12/08/2018, 16:49

Protocol trong Swift(P1)

1/ Cái gì là Protocol? Protocol - từ này dịch sang tiếng việt rất là chuối nên mình xin phép giữ nguyên tên tiếng anh để gọi nó. Protocol là thành phần trừu tượng cho phép bạn khai báo danh sách các phương thức và thuộc tính nhưng không cài đặt các phương thức này. Protocol được sử dụng làm ...

1/ Cái gì là Protocol?

  • Protocol - từ này dịch sang tiếng việt rất là chuối nên mình xin phép giữ nguyên tên tiếng anh để gọi nó.
  • Protocol là thành phần trừu tượng cho phép bạn khai báo danh sách các phương thức và thuộc tính nhưng không cài đặt các phương thức này.
  • Protocol được sử dụng làm lớp cơ sở cho bất kỳ class, struct, enum nào cũng có thể áp dụng thực thi. Class, struct, enum áp dụng protocol sẽ cài đặt các phương thức được khai báo trong protocol.

2/ Cú pháp khai báo và thực thi protocol:

  • Việc khai báo protocol cũng tương tự như bạn khai báo một class, bạn tuân thủ theo cú pháp sau:
protocol: <Tên protocol>  {
//  Khai báo các property và method.
}
  • Tương tự, để áp dụng thực thi một protocol bạn sử dụng toán tử “:” tương tự việc kế thừa:
class,struct,enum<Tên class/struct/enum>:  <Tên protocol> {
//  Implement các property và method của protocol.
}
  • Hai cú pháp trên bạn có thấy quen không nào? Rất giống việc khai báo class và thực hiện kế thừa cho class phải không? Thực tế thì làm việc với protocol cũng tương tự như làm việc với class thôi bạn ạ. Chỉ khác là bạn sẽ không cần phải cài đặt các phương thức của protocol mà bạn đã khai báo.

3/ Thuộc tính và phương thức:

a/ Khai báo phương thức:

  • Khai báo phương thức trong protocol tương tự khai báo hàm thông thường, nhưng không cài đặt. Việc cài đặt các phương thức này sẽ được class/struct/enum nào áp dụng thực hiện.
  • Ngoài ra, protocol cũng cho phép khai báo phương thức mutating để hỗ trợ người dùng thực hiện việc thay đổi giá trị nội tại của class/struct/enum thực thi protocol.
protocol StreetLegal {
    var chapter: String {get}
    var isActive: Bool {get, set}
}
  • Khi định nghĩa thuộc tính chỉ có {get} , chúng ta có thể khai báo là var hoặc let đều được nhưng nên khai báo là let do không thay đổi được giá trị.
  • Khi định nghĩa thuộc tính có cả {get, set} , chúng ta phải khai báo là var do được phép thay đổi giá trị.

b/ Khai báo phương thức:

  • Khai báo phương thức trong protocol tương tự khai báo hàm thông thường, nhưng không cài đặt. Việc cài đặt các phương thức này sẽ được class/struct/enum nào áp dụng thực hiện.
  • Ngoài ra, protocol cũng cho phép khai báo phương thức mutating để hỗ trợ người dùng thực hiện việc thay đổi giá trị nội tại của class/struct/enum thực thi protocol.
protocol StreetLegal {
    var chapter: String {get}
    var isActive: Bool {get, set}
    
    func signalStop() 
    func signalTurnLeft()
    func signalTurnRIght()
}
  • Các Method trên được khai báo nhưng không implement.

c/Áp dụng thực thi protocol:

  • Bây giờ chính là lúc để bạn thử sử dụng protocol StreetLegal đã được khai báo ở 2 phần trên. Nhìn lại sơ đồ trên, chúng ta sẽ có class Bicycle sẽ áp dụng protocol StreetLegal. Bây giờ mình sẽ làm mẫu một class, sau đó bạn hãy thử làm tiếp với hai class còn lại.
class Bicycle: StreetLegal {
   // chapter được chỉ định  {get} trong protocol nên ta phải khai báo let để người dùng không thay đổi giá trị.
   let chapter: String = "Chapter1: Bicycle Legal."
   // isActive được chỉ định {get, set} nên ta khai báo var để người dùng có thể gán giá trị.
   var isActive: Bool = true
   func signalStop() {
       print("Bending left arm downwards")
   }
    func signalTurnLeft() {}
    func signalTurnRIght() {}
    // Method của Bicycle.
    func startpedaling() {
    print("Here we go.")
    }
}
  • Như bạn thấy, class Bicycle áp dụng protocol StreetLegal do đó class này cần phải thực hiện cài đặt nội dung cho các phương thức mẫu của protocol StreetLegal. Đồng thời bạn cũng có thể thiết lập giá trị cho các thuộc tính của protocol StreetLegal tại đây.

4/ Tổng kết:

  • Bên trên là khái niệm và cách sử dụng cần nắm được của protocol. Chúng ta sẽ tiếp tục tìm hiểu về phương thức khởi tạo cũng như một số tính chất khác của protocol trong phần 2 nhé             </div>
            
            <div class=
0