Functions can accept any value that conforms to a protocol.

Pass conforming values

finished
protocol_parameters.swift
Replay: real traced execution (multi-file project)
protocol PrintableStatus {
    func statusText() -> String
}

struct Job: PrintableStatus {
    let name: String
    let finished: Bool

    func statusText() -> String {
        return finished ? "\(name):done" : "\(name):open"
    }
}

func renderStatus(_ item: PrintableStatus) -> String {
    return item.statusText()
}

let finished = false
let job = Job(name: "build", finished: finished)
let output = renderStatus(job)

print(output)
protocol PrintableStatus {
    func statusText() -> String
}

struct Job: PrintableStatus {
    let name: String
    let finished: Bool

    func statusText() -> String {
        return finished ? "\(name):done" : "\(name):open"
    }
}

func renderStatus(_ item: PrintableStatus) -> String {
    return item.statusText()
}

let finished = true
let job = Job(name: "build", finished: finished)
let output = renderStatus(job)

print(output)
  1. finished ← false, job ← Job(name: "build", finished: false)

    18let finished→ false = false  //@finished=true19let job→ Job(name: "build", finished: false) = Job(name: "build", finished: finishedfalse)20let output = renderStatus(jobJob(name: "build", finished: false))
  2. func renderStatus(_ item: PrintableStatus) -> String

    14func renderStatus(_ itemJob(name: "build", finished: false): PrintableStatus) -> String {15    return itemJob(name: "build", finished: false).statusText()16}
  3. func statusText() -> String

    9func statusText() -> String {10    return finishedfalse ? "\(namebuild):done" : "\(name):open"11}
  4. output ← build:open

    19let job = Job(name: "build", finished: finished)20let output→ build:open = renderStatus(jobJob(name: "build", finished: false))2122print(outputbuild:open)
    outputbuild:open
  1. finished ← true, job ← Job(name: "build", finished: true)

    18let finished→ true = true19let job→ Job(name: "build", finished: true) = Job(name: "build", finished: finishedtrue)20let output = renderStatus(jobJob(name: "build", finished: true))
  2. func renderStatus(_ item: PrintableStatus) -> String

    14func renderStatus(_ itemJob(name: "build", finished: true): PrintableStatus) -> String {15    return itemJob(name: "build", finished: true).statusText()16}
  3. func statusText() -> String

    9func statusText() -> String {10    return finishedtrue ? "\(namebuild):done" : "\(name):open"11}
  4. output ← build:done

    19let job = Job(name: "build", finished: finished)20let output→ build:done = renderStatus(jobJob(name: "build", finished: true))2122print(outputbuild:done)
    outputbuild:done
protocol type A protocol parameter lets a function depend on required behavior instead of a specific concrete type.