如何在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()方法不再需要在类型中实现。
结论
用默认行为扩展现有协议的能力是相当强大的。这允许协议的发展和扩展,而不必担心破坏现有代码的兼容性。