Starbucks Caramel Frappuccino
본문 바로가기
  • 그래 그렇게 조금씩
SwiftUI/SwiftUI(Basic)

39. [SwiftUI] Stepper() 스테퍼, Strideable

by Toughie 2023. 5. 1.

+ 버튼을 누르면 값이 증가하고, - 버튼을 누르면 값이 감소하는 간단한 기능이다.

정말 단순한 스테퍼도 있고, 커스텀 해서 다양하게 활용 가능한 스테퍼도 있다.

 

//  Created by Toughie on 2023/04/30.
//

import SwiftUI

struct StepperPrac: View {
    
    @State var stepperValue: Int = 10
    @State var widthIncrement: CGFloat = 0
    
    let fancyColor = LinearGradient(colors: [Color.blue, Color.green, Color.orange], startPoint: .topLeading, endPoint: .bottomTrailing)
    
    var body: some View {
        VStack(spacing: 20) {
        // 최소값 0 이상 보장
            Stepper("Stepper Basic: \(stepperValue)", value: $stepperValue, in: 0...Int.max)
            
            RoundedRectangle(cornerRadius: 25)
                .fill(fancyColor)
                
                //프레임의 너비가 화면 최대 너비 - 100 만큼까지만 늘어날 수 있고(min 비교),
                //최소 너비가 100 이상이도록(max 비교)
                //즉 최소 너비가 100 이상, 화면 최대 너비 - 100 이하
                .frame(
                width: min(max(widthIncrement + 100, 100), UIScreen.main.bounds.width - 100),
                height: 100)
                
                .overlay(Text("🦁"))
                .font(.largeTitle)
            
            Stepper("Stepper Advanced") {
                //Increment
                incrementWidth(amount: 20)

            } onDecrement: {
                //Decrement
                decrementWidth(amount: 20)

            } onEditingChanged: { Bool in
                //편집여부 확인
            }
        }
        .padding(.horizontal, 50)
    }
    
    private func incrementWidth(amount: CGFloat) {
        withAnimation(.easeInOut) {
            widthIncrement += amount
        }
    }
    
    private func decrementWidth(amount: CGFloat) {
        withAnimation(.easeInOut) {
            widthIncrement -= amount
        }
    }
}

 

+ Strideable

value에는 Strideable 프로토콜을 채택한 변수가 바인딩 되어야 한다.

Strideable은 프로토콜은 스위프트의 표준 라이브러리에 포함된 프로토콜 중 하나.

 

Strideable은 값을 일정한 간격으로 증가시키거나 감소시키는 기능을 제공하는 프로토콜.

Strideable 프로토콜을 채택한 타입은 값의 간격을 정의할 수 있는 Stride 타입을 가지고 있어야 한다.

 

- 일정한 간격으로 값의 *시퀀스를 생성하거나, 두 값 사이의 거리 계산 가능.

* 시퀀스 - 연관된 값들의 모음, 이 값을 차레대로 순회할 수 있도록 구성된 타입.

 

- Int, Float, Double과 같은 기본 타입은 Strideable 프로토콜을 채택

- for문에서 일정 간격 반복 가능(타입이 일정한 간격으로 변화하는 경우 유용하게 사용될 수 있음)