써니쿠키의 IOS 개발일기
[swift]열거형 연관된 값(Associated Values) 본문
열거형 연관된 값(Associated Values)
🤓 어쩌다 공부하게 되었는가..?
써머캣과 쥬스메이커 코드를 작성하다가 열거형(enum)으로 정리한 쥬스타입의 case마다 사용하는 원재료의 갯수를 연관지어 지정해놓고 싶었다.
예를들면 딸기바나나쥬스는 딸기10개 바나나1개를 사용하기 때문에 case 딸기바나나쥬스
를 case 딸기바나나쥬스(딸기: 10, 바나나:1)
로 연관값을 사용할 수 있지 않을까!? 했던 시도 중에 공부하게되었다..
⛔️결론은 연관값은 사용할 때마다 연관값은 달라진다의 특성때문에 Fix의 개념이 아니라서 사용하지 않았지만! 공부했던 내용이니 정리해두자..!
열거형의 연관값이란?
공식문서 소개 ( 출처 : Swift 공식문서 - Enumerations 중 Associated Values )
it’s sometimes useful to be able to store values of other types alongside these case values. This additional information is called an associated value, and it varies each time you use that case as a value in your code.
You can define Swift enumerations to store associated values of any given type, and the value types can be different for each case of the enumeration if needed.어떤 경우엔 열거형에서 case값에 함께 다른 타입의 값을 저장할 수 있는 것이 유용하다. 이 추가적인 정보를 연관된 값 (associated value) 라고 하고 그 연관된값이 있는 케이스를 코드에서 값으로 사용할 때면 사용할 때마다 연관값은 달라진다.
주어진 타입의 연관된 값을 저장하기 위해 Swift 열거형을 정의할 수 있고 = (의역: 연관값으로 어떤 타입도 사용가능하다.) 필요에 따라서 연관값의 타입은 열거형의 각 케이스마다 다를 수 있다
연관값은 Enum case의 추가정보를 저장하는 기능이라 할수 있다.
rawValue와는 다르게 case별로 타입을 다르게 설정해 줄 수 있다.
//rawValue에서는 정해진 타입으로만 값을 가질 수 있다 //여기서는 String 타입으로 예시를 들었다 enum Sport :String { case running = "달리기" case weightTraining = "웨이트 트레이닝" case swimming = "수영" } //연관값에서는 case마다 타입을 다르게 설정해 줄 수 있다. enum Sport2 { case running(속도: Double = 6.2, 거리: Int = 3) case weightTraining (헬스장: String = "써니짐") case swimming(거리: Int = 3) }
다른 항목에 연관값을 설정한다고 모든 항목에 연관값을 설정할 필요는 없다.
코드에서 값으로 사용할 때마다 연관값은 달라진다.
아래 예시에서 myOnepiece 의 사용을 보면 enum의 연관값에서 ribbon과 size를 true와 .M으로 설정해주었어도 사용시에는 연관값을 다시 설정해주어야한다.(fix개념이 아님!)
enum Size { case XS, S, M, L, XL } enum Cloths { case onepiece (ribbon: Bool = true, size: Size = .M) case shirt (color: String, size: Size) case pants } // 사용 let myOnepiece = Cloths.onepiece(ribbon: false, size: .S) let myshirts = Cloths.shirt(color: "white", size: .M) let myPants = Cloths.pants
연관값을 가지는 열거형의 switch 매칭을 이용할 수 있다
let blueShirt = Cloths.shirts(color: "blue", size: .M) // 연관값 color가 blue인 셔츠확인 switch blueShirt { case .onepiece(true, .S): print("") case .shirts("blue", _): print("찾았다 파란셔츠") case .pants: print("") default: print("여기없어") } //출력 : 찾았다 파란셔츠 // 연관값 color가 red인 셔츠확인 switch blueShirt { case .onepiece(true, .S): print("") case .shirts("red", _): print("찾았다 파란셔츠") case .pants: print("") default: print("여기없어") } //출력 : 여기없어
내 생각에는 연관값은 case의 내용은 같지만 세부내용이 조금씩 바뀔 때 사용하면 좋을 것 같다.
예를들어 옷장의 옷들을 정의할 때 위의 Cloths 열거형의 shirts 케이스를 이용해 여러색의 셔츠를 연관값만 바꿔서 선언해줄 수 있게된다. 그렇다면 한 case만 이용해서 여러 셔츠색 모두 선언이 가능한 것이다.
'swift, Ios' 카테고리의 다른 글
[swift] KVO 구현하기 (0) | 2022.09.07 |
---|---|
ios - Auto Layout (1) (0) | 2022.09.06 |
[swift] 제네릭? generic (0) | 2022.08.26 |
[swift] static 은 언제쓰지??? 타입메서드 / 타입프로퍼티 (0) | 2022.08.25 |
[swift] 재귀함수 (0) | 2022.08.24 |