Protocols can require readable or writable properties.

Require calculated data

width
property_requirements.swift
Replay: real traced execution (multi-file project)
protocol HasArea {
    var area: Int { get }
}

struct Rectangle: HasArea {
    let width: Int
    let height: Int

    var area: Int {
        return width * height
    }
}

let width = 6
let rectangle = Rectangle(width: width, height: 4)
let area = rectangle.area

print("width=\(width)")
print("area=\(area)")
protocol HasArea {
    var area: Int { get }
}

struct Rectangle: HasArea {
    let width: Int
    let height: Int

    var area: Int {
        return width * height
    }
}

let width = 3
let rectangle = Rectangle(width: width, height: 4)
let area = rectangle.area

print("width=\(width)")
print("area=\(area)")
protocol HasArea {
    var area: Int { get }
}

struct Rectangle: HasArea {
    let width: Int
    let height: Int

    var area: Int {
        return width * height
    }
}

let width = 9
let rectangle = Rectangle(width: width, height: 4)
let area = rectangle.area

print("width=\(width)")
print("area=\(area)")
  1. width ← 6

    14let width→ 6 = 6  //@width=3, 915let rectangle = Rectangle(width: width, height: 4)
  2. rectangle ← Rectangle(width: 6, height: 4)

    14let width = 6  //@width=3, 915let rectangle→ Rectangle(width: 6, height: 4) = Rectangle(width: width6, height: 4)16let area = rectangle.area
  3. return width * height

    9var area: Int {10    return width6 * height411}
  4. return width * height

    9    var area: Int {10        return width6 * height411    }12}1314let width = 6  //@width=3, 915let rectangle = Rectangle(width: width, height: 4)16let area = rectangle.area24
  5. return width * height

    9var area: Int {10    return width6 * height411}
  6. return width * height

    9var area: Int {10    return width6 * height411}
  7. return width * height

    9var area: Int {10    return width6 * height411}
  8. area ← 24

    15let rectangle = Rectangle(width: width, height: 4)16let area→ 24 = rectangle.area24
  9. print("width=\(width)")

    18print("width=\(width6)")19print("area=\(area)")
    outputwidth=6
  10. print("area=\(area)")

    18print("width=\(width)")19print("area=\(area24)")
    outputarea=24
  1. width ← 3

    14let width→ 3 = 315let rectangle = Rectangle(width: width, height: 4)
  2. rectangle ← Rectangle(width: 3, height: 4)

    14let width = 315let rectangle→ Rectangle(width: 3, height: 4) = Rectangle(width: width3, height: 4)16let area = rectangle.area
  3. return width * height

    9var area: Int {10    return width3 * height411}
  4. return width * height

    9    var area: Int {10        return width3 * height411    }12}1314let width = 315let rectangle = Rectangle(width: width, height: 4)16let area = rectangle.area12
  5. return width * height

    9var area: Int {10    return width3 * height411}
  6. return width * height

    9var area: Int {10    return width3 * height411}
  7. return width * height

    9var area: Int {10    return width3 * height411}
  8. area ← 12

    15let rectangle = Rectangle(width: width, height: 4)16let area→ 12 = rectangle.area12
  9. print("width=\(width)")

    18print("width=\(width3)")19print("area=\(area)")
    outputwidth=3
  10. print("area=\(area)")

    18print("width=\(width)")19print("area=\(area12)")
    outputarea=12
  1. width ← 9

    14let width→ 9 = 915let rectangle = Rectangle(width: width, height: 4)
  2. rectangle ← Rectangle(width: 9, height: 4)

    14let width = 915let rectangle→ Rectangle(width: 9, height: 4) = Rectangle(width: width9, height: 4)16let area = rectangle.area
  3. return width * height

    9var area: Int {10    return width9 * height411}
  4. return width * height

    9    var area: Int {10        return width9 * height411    }12}1314let width = 915let rectangle = Rectangle(width: width, height: 4)16let area = rectangle.area36
  5. return width * height

    9var area: Int {10    return width9 * height411}
  6. return width * height

    9var area: Int {10    return width9 * height411}
  7. return width * height

    9var area: Int {10    return width9 * height411}
  8. area ← 36

    15let rectangle = Rectangle(width: width, height: 4)16let area→ 36 = rectangle.area36
  9. print("width=\(width)")

    18print("width=\(width9)")19print("area=\(area)")
    outputwidth=9
  10. print("area=\(area)")

    18print("width=\(width)")19print("area=\(area36)")
    outputarea=36
property requirement A computed property can satisfy a protocol requirement just like a stored property can.