如何在 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() 方法不再需要在类型中实现。
结论
能够使用默认行为扩展现有协议非常强大。这允许协议在无需担心破坏现有代码的兼容性的情况下进行扩展和扩展。