티스토리 뷰

반응형

 

 


Strideable Protocol

Strideable 프로토콜은 1차원 값에 대한 연속적인 측정 및 표현이 가능한 타입을 정의합니다. Strideable 프로토콜을 적용한 타입은 사용자 정의 간격으로 특정범위의 반복을 수행할 수 있는 stride메서드와 함께 사용될 수 있습니다.

 

 


Declaration
선언 방법

 

 

Strideable은 프로토콜 규약입니다. Swift 표준 라이브러리에 속해있습니다. 

 

 


Overview
개요

Strideable 프로토콜을 준수하는 타입들은 stride(from:to:by:), stride(from:through:by:) 와 같은 메서드를 사용할 수 있습니다. 일반적으로 반복문 하면 자주 사용하는 for-in 루프를 떠올릴 수 있을텐데요. for 루프와 달리, stride 메서드는 부동소수점 단위 표현을 사용해 특정 간격으로 반복문을 수행할 때 사용합니다. 그 사용 예시는 아래와 같습니다.

 

 

 

 


위의 경우, radians 값은 0.0pi -> 0.5pi -> 1.0pi -> 1.5pi 총 4번의 값으로서 연산을 수행합니다. stride 메서드를 사용할때, from:to:by:를 사용할 경우, to: 인자값 미만의 범위로 간격을 두어 연산을 수행합니다. 이때 from:through:by: 의 인자값으로 stride 메서드를 수행하면 through: 인자값 이하의 범위로 간격을 두어 연산을 수행하게 됩니다. 만약 위의 예시에서 to: 대신 through: 로 받아서 stride문을 수행했다면, 0.0pi -> 0.5pi -> 1.0pi -> 1.5pi 에 2.0pi가 추가로 수행되는 것입니다. 

stride 메서드의 사용법을 정리하면 아래와 같습니다.

◼︎ stride(from:to:by:) : from에서부터 by의 간격으로 to "미만"의 범위에서 반복 연산 수행한다.
◼︎ stride(from:through:by:) : from에서부터 by의 간격으로 through "이하"의 범위에서 반복 연산 수행한다.

 

 


Integer stride

정수형 Stride를 가진 타입은 계산가능한 범위 내에서 사용될 수 있습니다. 그 예로, 정수형 범위를 지정하고, 해당 범위 내에서 Sequence, Collection 메서드를 사용할 수 있습니다. 

 

 



 


Conforming to the Strideable Protocol
Strideable 프로토콜 준수하기

Strideable 프로토콜을 커스텀 타입에 적용하기 위해서는 두 인스턴스 간의 거리를 표현할 수 있어야 하며, advanced(by:), distance(to:) 메서드를 구현해줘야 합니다. 그 예로, 아래 Date 구조체 타입은 Strideable 프로토콜을 적용 후, stride 메서드를 사용하고 있습니다.

 

 

 

 


Date 구조체는 비교연산자 사용이 가능하며(Equatable), 해당 객체를 출력할 때 커스텀으로 출력결과를 받아오도록 CustomStringConvertible 프로토콜도 채용하고 있습니다.

value 변수는 stride메서드 사용 간 반복 범위 확인에 사용하며, description 변수에는 해당 객체의 커스텀 출력값을 정의해두었습니다.

 

 

 

 


이제 앞서 만든 커스텀 Date 구조체의 extension입니다. 여기에서 Stride를 사용할 수 있도록 Strideable 프로토콜을 적용하고 있습니다. 앞서 말했듯이, Strideable 프로토콜을 적용하기 위해서는 advanded, distance를 설정해주어야 합니다. advanced 메서드는 stride문 실행 간 각 간격 마다 수행 될 연산을 정의합니다. distance는 다른 인스턴스 간의 간격값을 정의합니다. 

 

 

 


Using Stride with Strideable Type
Stride 메서드 사용하기

 

 


앞서 정의했던 Date 타입으로 두개의 인스턴스를 생성하고 있습니다. 두 개의 인스턴스, startDate / endDate는 각각 0, 16의 값을 갖고 있습니다. 이후, stride 메서드의 from, to에 앞서 생성한 인스턴스를 두고 stride메서드를 실행하고 있습니다.

위 두개의 stride 메서드 실행결과가 어떻게 될 지 감이 오시나요??? 정답은 아래에 있습니다. 먼저 고민해 보신 뒤 아래의 답을 보고 고민해보시면 좋을 것 같습니다. 🤗

 

 

 

 

 

 

 

 

 


만약 stride의 by: 인자로 정의하는 인터벌에 따라 색다른 인터벌을 주고 싶다면, 앞서 Strideable 프로토콜 적용 간 구현해야 했던 advanced 메서드를 수정하시면 됩니다. 위의 코드는 by: 인자로 받는 인터벌의 2배만큼의 값을 증가시켜 결과값으로 반환하고 있습니다.

해당 결과값도 앞서 실행했던 stride문에 사용된다면 어떤 출력값이 될 시 고민해 보시고 아래의 결과를 참고하시면 되겠습니다. 🤗

 

 

 

 

 

 

 

 

 

반응형
댓글
반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함