// 貼著哪邊走的選項
enum Side {
case left, right
}
// 將「左右邊被擋住」的狀況放到同一個函數中處理。
func isBlockedOn(_ side: Side) -> Bool {
side == .left ? isBlockedLeft : isBlockedRight
}
// 將「向左右走」放到同一個函數中處理。
func turn(_ side: Side) {
if side == .left { turnLeft() }
else { turnRight() }
}
// 走反方向
func turnOtherSide(from side: Side) {
if side == .left { turnRight() }
else { turnLeft() }
}
// ⭐️ 沿著某一邊走的策略,
// 將來可以寫入 Actor 的 extension 中。
func walk(along side: Side = .left, handle:()->Void = {}) {
if !isBlockedOn(side) { // 如果指定邊沒擋住,就走這一邊
turn(side)
moveForward()
handle()
} else if !isBlocked { // 不然如果前面沒擋住,就走前面
moveForward()
handle()
} else { // 否則就轉向另一邊
turnOtherSide(from: side)
}
}