Protocols
Default Implementation
Protocol extensions can provide behavior that conforming types inherit.
Share default behavior
default_implementation.swift
Replay: real traced execution (multi-file project)
protocol Greeter {
var name: String { get }
}
extension Greeter {
func greeting() -> String {
return "Hello, \(name)"
}
}
struct Member: Greeter {
let name: String
}
let memberName = "Grace"
let member = Member(name: memberName)
let message = member.greeting()
print(message)
protocol Greeter {
var name: String { get }
}
extension Greeter {
func greeting() -> String {
return "Hello, \(name)"
}
}
struct Member: Greeter {
let name: String
}
let memberName = "Linus"
let member = Member(name: memberName)
let message = member.greeting()
print(message)
protocol Greeter {
var name: String { get }
}
extension Greeter {
func greeting() -> String {
return "Hello, \(name)"
}
}
struct Member: Greeter {
let name: String
}
let memberName = "Matz"
let member = Member(name: memberName)
let message = member.greeting()
print(message)
memberName ← Grace, member ← Member(name: "Grace")
15let memberName→ Grace = "Grace" //@memberName="Linus", "Matz"16let member→ Member(name: "Grace") = Member(name: memberNameGrace)17let message = memberMember(name: "Grace").greeting()func greeting() -> String
5extension Greeter {6 func greeting() -> String {7 return "Hello, \(nameGrace)"8 }message ← Hello, Grace
16let member = Member(name: memberName)17let message→ Hello, Grace = memberMember(name: "Grace").greeting()1819print(messageHello, Grace)outputHello, Grace
memberName ← Linus, member ← Member(name: "Linus")
15let memberName→ Linus = "Linus"16let member→ Member(name: "Linus") = Member(name: memberNameLinus)17let message = memberMember(name: "Linus").greeting()func greeting() -> String
5extension Greeter {6 func greeting() -> String {7 return "Hello, \(nameLinus)"8 }message ← Hello, Linus
16let member = Member(name: memberName)17let message→ Hello, Linus = memberMember(name: "Linus").greeting()1819print(messageHello, Linus)outputHello, Linus
memberName ← Matz, member ← Member(name: "Matz")
15let memberName→ Matz = "Matz"16let member→ Member(name: "Matz") = Member(name: memberNameMatz)17let message = memberMember(name: "Matz").greeting()func greeting() -> String
5extension Greeter {6 func greeting() -> String {7 return "Hello, \(nameMatz)"8 }message ← Hello, Matz
16let member = Member(name: memberName)17let message→ Hello, Matz = memberMember(name: "Matz").greeting()1819print(messageHello, Matz)outputHello, Matz
protocol extension
A protocol extension can define a method once so each conforming type can reuse it unless it needs custom behavior.