如何在Swift协议中定义可选方法

如何在Swift协议中定义可选方法

本文将向你解释如何定义协议中的可选方法。

在深入研究在协议中制作可选方法之前,你将首先学习什么是协议以及如何在Swift中声明一个协议。

什么是《protocol》

协议是一种定义了一组方法或属性的类型。基本上,你可以定义一个方法的蓝图来指定行为。协议类似于其他编程语言中的接口。

语法

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()方法不再需要在类型中实现。

结论

用默认行为扩展现有协议的能力是相当强大的。这允许协议的发展和扩展,而不必担心破坏现有代码的兼容性。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

Swift 教程