[Swift] Strideable Protocol

2022. 10. 17. 20:18iOS/Swift

Strideable Protocol은 offset 및 측정 가능한 연속적 1차원 값을 나타내는 유형이다.

 

Strideable 프로토콜을 준수한다면 stride(from:to:by:), stride(from:through:by:) 메서드를 사용할 수 있다.

  • stride(from:to:by:) → from ~ to 미만의 범위를 by 간격으로 반복 수행한다
  • stride(from:through:by:) → from ~ through 이하의 범위를 by 간격으로 반복 수행한다

 

custom type에 Strideable을 채택하면 advanced(by:), distance(to:) 메서드를 추가해야한다.

enum Week: Int {
    case monday = 0
    case tuesday, wednesday, thursday, friday, saturday, sunday
}

Week에 Strideable 프로토콜을 채택하면

typealias Stride = ##Code##

Stride를 정의하라고 한다.

나는 Strinde를 Int로 해줬다.

이제 distance와 advanced를 정의하라고 한다.

func distance(to other: Week) -> Int {

}

func advanced(by n: Int) -> Week {

}

// Stride를 Double로 정의하면 아래처럼 나옴

func distance(to other: Week) -> Double {

}

func advanced(by n: Double) -> Week {

}

Stride에 String을 넣으면 Stride를 정의하라고 다시 나온다 ㅠ

Double은 된다.

생각해보니 String은 서로의 거리를 알 수 없네 좀 멍청했다.

extension Week: Strideable {
    typealias Stride = Int

    func distance(to other: Week) -> Int {
        other.rawValue - self.rawValue
    }

    func advanced(by n: Int) -> Week {
        return Week(rawValue: self.rawValue + n)!
    }
}

이렇게 값을 정의해줬다.

let monday = Week.monday
let friday = Week.friday

for day in stride(from: monday, to: friday, by: 2) {
    print(day)
}

// monday
// wednesday

for day in stride(from: monday, through: friday, by: 2) {
    print(day)
}

// monday
// wednesday
// friday

오옹

 

mondayd와 friday는 몇 일 차이날까?

print(monday.distance(to: friday)) // 4

to: 라서 미만을 알려주는가보다.

 

 

monday에서 3을 더하면 무슨 요일일까?

print(monday.advanced(by: 3)) // thursday

 

체스게임 만드는 과제 하다가 알게된 프로토콜이였는데 겁나 유용했었다.

다른 곳 어딘가에도 쓸 일이 있지않을까🫣