如何在 Swift 協議中定義可選方法?
本文將向您解釋如何在協議中定義可選方法。
在深入研究如何在協議中建立可選方法之前,您將首先了解什麼是協議以及如何在 Swift 中宣告協議。
什麼是協議?
協議是一種定義方法或屬性組的型別。基本上,您可以定義方法的藍圖來指定行為。協議類似於其他程式語言中的介面。
語法
以下是 Swift 中簡單協議的語法:
protocol <protocol_name> {
// Properties
// Methods
}
基本示例
在此示例中,您將建立一個名為 Person 的協議,以及一些與人員實體相關的屬性和方法。
以下是 Swift 中人員協議的示例:
protocol PersonProtocol { // Properties var id: String { get set } // Methods func fullName() -> String }
PersonProtocol 定義了一個名為 id 的屬性,該屬性具有 getter 和 setter 方法,以及一個名為 fullName() 的方法,該方法返回一個字串。要符合此協議,型別必須實現這兩個要求。
以下是一個符合 PersonProtocol 協議的結構體的示例:
struct Employee: PersonProtocol { let firstName: String let lastName: String }
現在,如果您編譯上述程式碼,則必須收到如下錯誤訊息:
Type 'Employee' does not conform to protocol 'PersonProtocol'
錯誤訊息清楚地表明名為 PersonProtocol 的協議未正確符合。出現此錯誤是因為您尚未在 Employee 型別中實現所需的方法和屬性。
這意味著您必須滿足所有實現要求才能符合協議。您可以更改程式碼使其如下所示:
struct Employee: PersonProtocol { // MARK: - Properties let firstName: String let lastName: String // MARK: - PersonProtocol var id: String = UUID().uuidString func fullName() -> String { return firstName + " " + lastName } }
請注意,在定義的協議中宣告的內容必須在符合的型別中實現。但有時,不需要在型別中實現所有方法。
協議還可以指定可選要求,這些要求是符合的型別可以選擇實現的方法或屬性。協議擴充套件是將方法或屬性標記為可選的首選方式。
協議擴充套件是一種提供方法或屬性的預設實現以使其成為可選的方式。儘管有預設實現,但符合協議的型別可以提供其自己的可選方法實現。
讓我們看一個提供協議預設實現的示例:
讓我們建立另一個類似於以下內容的協議:
protocol Stack { var elementCount: Int { get } mutating func push(_ element: Int) mutating func pop() -> Int? }
在上述協議中,我們定義了 Stack 以及一些屬性和方法。目前,所有方法都需要像下面這樣實現:
struct StackContainer: Stack { private var items: [Int] = [] var elementCount: Int { items.count } mutating func push(_ element: Int) { items.insert(element, at: 0) } mutating func pop() -> Int? { items.removeLast() } }
現在,您不想在型別中實現 pop() 方法。因此,您可以像下面這樣提供此方法的預設實現:
extension Stack { mutating func pop() -> Int? { return nil } }
型別符合的實現可能如下所示:
struct StackContainer: Stack { private var items: [Int] = [] var elementCount: Int { items.count } mutating func push(_ element: Int) { items.insert(element, at: 0) } }
如您所見,pop() 方法不再需要在型別中實現。
結論
能夠使用預設行為擴充套件現有協議非常強大。這允許協議在無需擔心破壞現有程式碼的相容性的情況下進行擴充套件和擴充套件。
資料結構
網路
關係型資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C 語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP