當我們討論物件導向的時候,通常會聽到“類別”、“繼承”和“多態性”等詞彙。然而,Swift為我們帶來了另一種有力的工具:協定。今天,我們將深入了解Swift中的協定(Protocols),並學習如何有效地實現它們。
協定定義了一套要求,該要求可被類別、結構或列舉採用和實現。它可以指定屬性和方法的名稱,但不提供實現。你可以將協定看作是一種能夠被多個類型實現的接口或模板。
protocol SomeProtocol {
var someProperty: Int { get set }
func someMethod()
}
當類別或結構採用某一協定時,它必須提供該協定中定義的所有方法和屬性的具體實現。
struct SomeStruct: SomeProtocol {
var someProperty: Int = 0
func someMethod() {
print("This is a method from the protocol!")
}
}
如果類別已經有了父類,則將協定名稱放在父類名稱之後,用逗號分隔:
class SomeClass: SomeSuperclass, FirstProtocol, SecondProtocol {
// class implementation
}
協定可以要求其遵循者提供特定名稱和類型的實例屬性或類型屬性。
protocol AnotherProtocol {
static var someTypeProperty: Int { get }
}
協定可以要求遵循它的類型提供特定的實例方法和類型方法。
protocol RandomNumberGenerator {
func random() -> Double
}
有時協定的方法可能需要修改其遵循者。mutating
關鍵字用於標記這些方法。
protocol Togglable {
mutating func toggle()
}
協定可以繼承其他協定的要求。
protocol PrettyPrintable: SomeProtocol {
func prettyDescription() -> String
}
使用擴展,你可以為協定提供方法、計算屬性的默認實現,甚至提供其他協定的實現。
extension PrettyPrintable {
func prettyDescription() -> String {
return "Pretty Description"
}
}
協定允許我們建立靈活、可重用的代碼。它們可以用作類型,並與關聯類型一起使用,使得設計更具靈活性。
例如,我們可以建立一個接受遵循PrettyPrintable
協定的任何類型的函數:
func printPrettyDescription(thing: PrettyPrintable) {
print(thing.prettyDescription())
}
總結:
協定在Swift中扮演著極其重要的角色,它為我們提供了一個強大的工具,讓我們能夠設計更加靈活和可重用的代碼。經過今天的學習,你應該已經了解了協定的基礎,以及如何在Swift中有效地使用它們。