Protocol extensions can provide behavior that conforming types inherit.

Share default behavior

memberName
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)
  1. 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()
  2. func greeting() -> String

    5extension Greeter {6    func greeting() -> String {7        return "Hello, \(nameGrace)"8    }
  3. message ← Hello, Grace

    16let member = Member(name: memberName)17let message→ Hello, Grace = memberMember(name: "Grace").greeting()1819print(messageHello, Grace)
    outputHello, Grace
  1. memberName ← Linus, member ← Member(name: "Linus")

    15let memberName→ Linus = "Linus"16let member→ Member(name: "Linus") = Member(name: memberNameLinus)17let message = memberMember(name: "Linus").greeting()
  2. func greeting() -> String

    5extension Greeter {6    func greeting() -> String {7        return "Hello, \(nameLinus)"8    }
  3. message ← Hello, Linus

    16let member = Member(name: memberName)17let message→ Hello, Linus = memberMember(name: "Linus").greeting()1819print(messageHello, Linus)
    outputHello, Linus
  1. memberName ← Matz, member ← Member(name: "Matz")

    15let memberName→ Matz = "Matz"16let member→ Member(name: "Matz") = Member(name: memberNameMatz)17let message = memberMember(name: "Matz").greeting()
  2. func greeting() -> String

    5extension Greeter {6    func greeting() -> String {7        return "Hello, \(nameMatz)"8    }
  3. 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.