Generics
Type Constraints
Constraints let generic code require capabilities such as comparison.
Require comparable values
type_constraints.swift
Replay: real traced execution (multi-file project)
func larger<T: Comparable>(_ left: T, _ right: T) -> T {
return left >= right ? left : right
}
let leftScore = 14
let rightScore = 18
let winner = larger(leftScore, rightScore)
let summary = "winner=\(winner)"
print(summary)
func larger<T: Comparable>(_ left: T, _ right: T) -> T {
return left >= right ? left : right
}
let leftScore = 3
let rightScore = 18
let winner = larger(leftScore, rightScore)
let summary = "winner=\(winner)"
print(summary)
func larger<T: Comparable>(_ left: T, _ right: T) -> T {
return left >= right ? left : right
}
let leftScore = 21
let rightScore = 18
let winner = larger(leftScore, rightScore)
let summary = "winner=\(winner)"
print(summary)
leftScore ← 14, rightScore ← 18
5let leftScore→ 14 = 14 //@leftScore=3, 216let rightScore→ 18 = 187let winner = larger(leftScore14, rightScore18)8let summary = "winner=\(winner)"func larger<T: Comparable>(_ left: T, _ right: T) -> T
1func larger<T: Comparable>(_ left14: T, _ right18: T) -> T {2 return left14 >= right18 ? left : right3}winner ← 18, summary ← winner=18
6let rightScore = 187let winner→ 18 = larger(leftScore14, rightScore18)8let summary→ winner=18 = "winner=\(winner18)"910print(summarywinner=18)outputwinner=18
leftScore ← 3, rightScore ← 18
5let leftScore→ 3 = 36let rightScore→ 18 = 187let winner = larger(leftScore3, rightScore18)8let summary = "winner=\(winner)"func larger<T: Comparable>(_ left: T, _ right: T) -> T
1func larger<T: Comparable>(_ left3: T, _ right18: T) -> T {2 return left3 >= right18 ? left : right3}winner ← 18, summary ← winner=18
6let rightScore = 187let winner→ 18 = larger(leftScore3, rightScore18)8let summary→ winner=18 = "winner=\(winner18)"910print(summarywinner=18)outputwinner=18
leftScore ← 21, rightScore ← 18
5let leftScore→ 21 = 216let rightScore→ 18 = 187let winner = larger(leftScore21, rightScore18)8let summary = "winner=\(winner)"func larger<T: Comparable>(_ left: T, _ right: T) -> T
1func larger<T: Comparable>(_ left21: T, _ right18: T) -> T {2 return left21 >= right18 ? left : right3}winner ← 21, summary ← winner=21
6let rightScore = 187let winner→ 21 = larger(leftScore21, rightScore18)8let summary→ winner=21 = "winner=\(winner21)"910print(summarywinner=21)outputwinner=21
type constraint
A constrained type parameter can use operations promised by the protocol constraint.