티스토리 뷰
Strideable Protocol
Strideable 프로토콜은 1차원 값에 대한 연속적인 측정 및 표현이 가능한 타입을 정의합니다. Strideable 프로토콜을 적용한 타입은 사용자 정의 간격으로 특정범위의 반복을 수행할 수 있는 stride메서드와 함께 사용될 수 있습니다.
Declaration
선언 방법
![](https://blog.kakaocdn.net/dn/cinRtb/btqF3FIYoNV/40KJDcX4WfQALVGFMAQHpk/img.png)
Strideable은 프로토콜 규약입니다. Swift 표준 라이브러리에 속해있습니다.
Overview
개요
Strideable 프로토콜을 준수하는 타입들은 stride(from:to:by:), stride(from:through:by:) 와 같은 메서드를 사용할 수 있습니다. 일반적으로 반복문 하면 자주 사용하는 for-in 루프를 떠올릴 수 있을텐데요. for 루프와 달리, stride 메서드는 부동소수점 단위 표현을 사용해 특정 간격으로 반복문을 수행할 때 사용합니다. 그 사용 예시는 아래와 같습니다.
![](https://blog.kakaocdn.net/dn/b8wat8/btqF3GHT9u9/vkJQYsCtKG4fTuCsSd39R0/img.png)
위의 경우, 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 메서드를 사용할 수 있습니다.
![](https://blog.kakaocdn.net/dn/bt2bbe/btqF3T1ia6I/8UBTkin5STyXMPuO5UOBvk/img.png)
Conforming to the Strideable Protocol
Strideable 프로토콜 준수하기
Strideable 프로토콜을 커스텀 타입에 적용하기 위해서는 두 인스턴스 간의 거리를 표현할 수 있어야 하며, advanced(by:), distance(to:) 메서드를 구현해줘야 합니다. 그 예로, 아래 Date 구조체 타입은 Strideable 프로토콜을 적용 후, stride 메서드를 사용하고 있습니다.
![](https://blog.kakaocdn.net/dn/rdIYE/btqF16gbDUu/y35SkgVM01bke8VB6cr5u1/img.png)
Date 구조체는 비교연산자 사용이 가능하며(Equatable), 해당 객체를 출력할 때 커스텀으로 출력결과를 받아오도록 CustomStringConvertible 프로토콜도 채용하고 있습니다.
value 변수는 stride메서드 사용 간 반복 범위 확인에 사용하며, description 변수에는 해당 객체의 커스텀 출력값을 정의해두었습니다.
![](https://blog.kakaocdn.net/dn/LCr0y/btqF4VxAaTY/oN2HRu0AIvdpN4Yi3T68H0/img.png)
이제 앞서 만든 커스텀 Date 구조체의 extension입니다. 여기에서 Stride를 사용할 수 있도록 Strideable 프로토콜을 적용하고 있습니다. 앞서 말했듯이, Strideable 프로토콜을 적용하기 위해서는 advanded, distance를 설정해주어야 합니다. advanced 메서드는 stride문 실행 간 각 간격 마다 수행 될 연산을 정의합니다. distance는 다른 인스턴스 간의 간격값을 정의합니다.
Using Stride with Strideable Type
Stride 메서드 사용하기
![](https://blog.kakaocdn.net/dn/pjy11/btqF1Tao7Y1/0zCOk59XZCOZth2vN579lK/img.png)
앞서 정의했던 Date 타입으로 두개의 인스턴스를 생성하고 있습니다. 두 개의 인스턴스, startDate / endDate는 각각 0, 16의 값을 갖고 있습니다. 이후, stride 메서드의 from, to에 앞서 생성한 인스턴스를 두고 stride메서드를 실행하고 있습니다.
위 두개의 stride 메서드 실행결과가 어떻게 될 지 감이 오시나요??? 정답은 아래에 있습니다. 먼저 고민해 보신 뒤 아래의 답을 보고 고민해보시면 좋을 것 같습니다. 🤗
![](https://blog.kakaocdn.net/dn/ce6xLL/btqF5dY4iJA/VFKqWwjT4pXyJDPaLlCn31/img.png)
![](https://blog.kakaocdn.net/dn/bAZcJW/btqF2RwlYs6/TYZ6ZvVCiP6DOHd292C6m0/img.png)
만약 stride의 by: 인자로 정의하는 인터벌에 따라 색다른 인터벌을 주고 싶다면, 앞서 Strideable 프로토콜 적용 간 구현해야 했던 advanced 메서드를 수정하시면 됩니다. 위의 코드는 by: 인자로 받는 인터벌의 2배만큼의 값을 증가시켜 결과값으로 반환하고 있습니다.
해당 결과값도 앞서 실행했던 stride문에 사용된다면 어떤 출력값이 될 시 고민해 보시고 아래의 결과를 참고하시면 되겠습니다. 🤗
![](https://blog.kakaocdn.net/dn/4Cjn0/btqF5AT2wmE/U9DOrCGkFqqyPOwNXRSnzK/img.png)
'iOS 개발 > 개발자문서 정보' 카테고리의 다른 글
Swift 문서, 제네릭 범위 구조체 Range 알아보기 (3) | 2020.08.02 |
---|---|
Swift 문법, String Literals 문자열 리터럴 사용법 (0) | 2020.08.01 |
iOS 앱 생애주기 관리, UIApplicationDelegate 개요 (0) | 2020.07.30 |
iOS 생애주기 관리, 프로토콜 UISceneDelegate 개요 (0) | 2020.07.29 |
Swift 문법, Extension에 Generic Where 절 활용하기 (0) | 2020.07.28 |
- Total
- Today
- Yesterday
- 알고리즘문제
- swift문제
- 백준알고리즘
- 부스트코스
- 프로그래머스swift
- SwiftUI
- Protocol
- ios
- swift
- swift string
- CoreML
- 김프매매
- 스위프트
- swift 기초
- swift언어
- createML
- 백준swift
- 알고리즘
- Collection
- Swift 알고리즘
- 개발자문서
- swift reduce
- swift알고리즘
- 프로토콜
- swift 문자열
- 자연어처리
- 프로그래머스
- uikit
- 컬렉션
- publisher
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |