Protocols
Property Requirements
Protocols can require readable or writable properties.
Require calculated data
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)")
width ← 6
14let width→ 6 = 6 //@width=3, 915let rectangle = Rectangle(width: width, height: 4)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.areareturn width * height
9var area: Int {10 return width6 * height411}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.area24return width * height
9var area: Int {10 return width6 * height411}return width * height
9var area: Int {10 return width6 * height411}return width * height
9var area: Int {10 return width6 * height411}area ← 24
15let rectangle = Rectangle(width: width, height: 4)16let area→ 24 = rectangle.area24print("width=\(width)")
18print("width=\(width6)")19print("area=\(area)")outputwidth=6print("area=\(area)")
18print("width=\(width)")19print("area=\(area24)")outputarea=24
width ← 3
14let width→ 3 = 315let rectangle = Rectangle(width: width, height: 4)rectangle ← Rectangle(width: 3, height: 4)
14let width = 315let rectangle→ Rectangle(width: 3, height: 4) = Rectangle(width: width3, height: 4)16let area = rectangle.areareturn width * height
9var area: Int {10 return width3 * height411}return width * height
9 var area: Int {10 return width3 * height411 }12}1314let width = 315let rectangle = Rectangle(width: width, height: 4)16let area = rectangle.area12return width * height
9var area: Int {10 return width3 * height411}return width * height
9var area: Int {10 return width3 * height411}return width * height
9var area: Int {10 return width3 * height411}area ← 12
15let rectangle = Rectangle(width: width, height: 4)16let area→ 12 = rectangle.area12print("width=\(width)")
18print("width=\(width3)")19print("area=\(area)")outputwidth=3print("area=\(area)")
18print("width=\(width)")19print("area=\(area12)")outputarea=12
width ← 9
14let width→ 9 = 915let rectangle = Rectangle(width: width, height: 4)rectangle ← Rectangle(width: 9, height: 4)
14let width = 915let rectangle→ Rectangle(width: 9, height: 4) = Rectangle(width: width9, height: 4)16let area = rectangle.areareturn width * height
9var area: Int {10 return width9 * height411}return width * height
9 var area: Int {10 return width9 * height411 }12}1314let width = 915let rectangle = Rectangle(width: width, height: 4)16let area = rectangle.area36return width * height
9var area: Int {10 return width9 * height411}return width * height
9var area: Int {10 return width9 * height411}return width * height
9var area: Int {10 return width9 * height411}area ← 36
15let rectangle = Rectangle(width: width, height: 4)16let area→ 36 = rectangle.area36print("width=\(width)")
18print("width=\(width9)")19print("area=\(area)")outputwidth=9print("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.