Protocols
Protocol Parameters
Functions can accept any value that conforms to a protocol.
Pass conforming values
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)
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))func renderStatus(_ item: PrintableStatus) -> String
14func renderStatus(_ itemJob(name: "build", finished: false): PrintableStatus) -> String {15 return itemJob(name: "build", finished: false).statusText()16}func statusText() -> String
9func statusText() -> String {10 return finishedfalse ? "\(namebuild):done" : "\(name):open"11}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
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))func renderStatus(_ item: PrintableStatus) -> String
14func renderStatus(_ itemJob(name: "build", finished: true): PrintableStatus) -> String {15 return itemJob(name: "build", finished: true).statusText()16}func statusText() -> String
9func statusText() -> String {10 return finishedtrue ? "\(namebuild):done" : "\(name):open"11}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.