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

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


Khái niệm

Protocol được hiểu như là một kế hoạch chi tiết của thuộc tính, phương thức,.. để thích hợp với từng nhiệm vụ hay tính năng cụ thể. Sau khi được chấp nhận bởi các cấu trúc, liên kết hay class . Protocol có thể sau khi được chấp nhận bởi class, cấu trúc hoặc liệt kê (enum) để cung cấp sự thực thi của những yêu cầu đó.

Cú pháp protocol

protocol SomeProtocol {
    protocol definition goes here
}

Yêu cầu thuộc tính

Bất kỳ một protocol nào bạn cũng có thể yêu cầu một kiểu phù hợp để cung cấp các kiểu thuộc tính như tên, kiểu, ..và protocol sẽ chỉ định ra những thuộc tính có thể lấy hay thuộc tính có thể thiết lập.
Nếu như thuộc tính được protocol yêu cầu là có thể lấy thì yêu cầu này hoàn toàn hợp lệ với kiểu thuộc tính để thiết lập nếu như chúng có ích cho mã của bạn.
Thuộc tính có khả năng lấy và thiết lập được chỉ ra rằng viết {get, set} sau khi mô tả kiểu của chúng, và thuộc tính có  thể thiết lập bởi phương thức {get}.
protocol SomeProtocol {
     var mustBeSettable: Int { get set }
     var doesNotNeedToBeSettable: Int { get }
}

Yêu cầu phương thức

Protocol có thể yêu cầu một thể hiện của phương thức hay kiểu của phương thức để thực thi với kiểu phù hợp. Và thành phần định nghĩa của protocol sẽ được hình thành từ những phương thức này.
Trước khi định nghĩa một phương thức nào đó lập trình viên cần thêm từ khóa static trước yêu cầu phương thức đó.
protocol SomeProtocol {
    static func someTypeMethod()
}
Bạn có thể tham khảo ví dụ dưới đây để hiểu cách định nghĩa protocol với yêu cầu phương thức thể hiện đơn.
protocol RandomNumberGenerator {
    func random() -> Double
}
Để có một phương thức thể hiện random thì protocol sẽ yêu cầu bất kỳ kiểu phù hợp nào. Khi được gọi nó sẽ trả về giá trị Double dù cho nó không được chỉ định như 1 thành phần của protocol.

Protocol, RandomNumberGenerator ,hoàn toàn không tạo bất kỳ giả định nào về việc cách thức để mỗi số ngẫu nhiên được khởi tạo, thay vào đó nó chỉ yêu cầu trình khởi tạo cung cấp một cách chuẩn nhất để khởi tạo một số ngẫu nhiên mới.

Yêu cầu trình khởi tạo

Lập trình viên có thể viết những trình khởi tạo như thành phần định nghĩa của protocol một cách chuẩn xác cho trình khởi tạo thông thường.
protocol SomeProtocol {
    init(someParameter: Int)
}

Protocol of types

Dù protocol không thực hiện bất kỳ tính năng nào của chúng. nhưng bất kỳ một protocol nào mà bạn tạo ra cũng sẽ trở thành kiểu đầy đủ, chính thức cho mã mà bạn sử dụng.
Bạn hoàn toàn có thể sử dụng 1 protocol trong nhiều trường hợp, nhiều kiểu được cho phép như:
  • Một kiểu trả về hay tham số trong hàm, phương thức và trình khởi tạo
  • Một kiểu biến số, hằng số hay thuộc tính.
  • Một kiểu hạng mục trong từ điển, trong bảng hay ở những nơi khác.
protocol RandomNumberGenerator {
    func random() -> Double
}

class Dice {

   let sides: Int
   let generator: RandomNumberGenerator

   init(sides: Int, generator: RandomNumberGenerator) {
        self.sides = sides
        self.generator = generator
   }

   func roll() -> Int {
        return Int(generator.random() * Double(sides)) + 1
   }
}

Delegation

Đây là coi là một kiểu mẫu thiết kế cho phép cấu trúc hoặc class ủy quyền một số trách nhiệm của chúng đến thể hiện của kiểu khác. Để có trách nhiệm ủy quyền, đảm bảo cung cấp tính năng ủy quyền thì những mẫu thiết kế này đều được thực thi bởi một protocol. 
protocol DiceGame {
     var dice: Dice { get }
     func play()
}
protocol DiceGameDelegate {
     func gameDidStart(game: DiceGame)
     func game(game: DiceGame, didStartNewTurnWithDiceRoll diceRoll: Int)
     func gameDidEnd(game: DiceGame)
}
Bài tiếp theo: Generics 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!