پروتکل ها (Swift Protocols)
«پروتکل (Protocol)» یعنی قرارداد رفتار. یعنی می گوییم چه متد و ویژگی لازم است. سپس، هر نوعی این قرارداد را اجرا کند، قابل جایگزین می شود. مثل قوانین کلاس که همه باید رعایت کنند.
تعریف و پذیرش پروتکل
پروتکل فقط نقشه متدها و ویژگی هاست. پیاده سازی با نوعِ پذیرنده است. بنابراین، چند نوع می توانند یک رفتار مشترک داشته باشند.
protocol Greetable {
func greet() -> String;
}
struct Person: Greetable {
var name: String;
func greet() -> String {
return "Hello, \(name)";
}
}
let p = Person(name: "Swift");
print(p.greet());
نکته: با پذیرش پروتکل، نوعِ شما قابل استفاده در هر جایی با همین قرارداد می شود.
افزونه پروتکل و پیاده سازی پیش فرض
«افزونه (Extension)» روی پروتکل می تواند متد پیش فرض بدهد. سپس، هر نوعی خواست، آن را بازنویسی می کند.
protocol Describable {
func describe() -> String;
}
extension Describable {
func describe() -> String {
return "(no description)";
}
}
struct User: Describable {
let name: String;
}
struct Car: Describable {
let model: String;
func describe() -> String {
return "Car: \(model)";
}
}
let u = User(name: "Morgan");
let c = Car(model: "SwiftMobile");
print(u.describe());
print(c.describe());
پروتکل با نوعِ وابسته (Associated Type)
«نوعِ وابسته (associatedtype)» پروتکل را کلی می کند. بعد، هر پذیرنده نوعِ واقعی را تعیین می کند.
protocol Container {
associatedtype Element;
mutating func append(_ item: Element);
var count: Int { get };
subscript(i: Int) -> Element { get };
}
struct IntStack: Container {
private var items: [Int] = [];
mutating func append(_ item: Int) {
items.append(item);
}
var count: Int {
return items.count;
}
subscript(i: Int) -> Int {
return items[i];
}
}
func allItemsMatch<C1: Container, C2: Container>(_ c1: C1, _ c2: C2) -> Bool
where C1.Element == C2.Element, C1.Element: Equatable {
guard c1.count == c2.count else {
return false;
}
var i = 0;
while i < c1.count {
if c1[i] != c2[i] {
return false;
}
i += 1;
}
return true;
}
گام های تمرینی
- یک پروتکل
Drawableباdraw()بساز. - دو نوع متفاوت را پذیرنده آن کن.
- یک آرایه پذیرنده ها بساز و همه را رسم کن.
لینک های داخلی
برای مرور، به چندریختی نگاه کن. همچنین، صفحه جنریک ها را ببین. برای سئو، این پیوند با کلمه کلیدی: پروتکل های سوئیفت.
جمع بندی سریع
- پروتکل، قرارداد رفتار مشترک است.
- افزونه پروتکل، متد پیش فرض می دهد.
- associatedtype پروتکل را کلی می کند.
- انواع پذیرنده، قابل جایگزین می شوند.