enum이 뭐냐? 이거 왜 쓰는거냐?
enum이라는 아이는 여러가지 케이스를 분리해서 활용해야 할 경우 사용한다. 예를 들어서 학교라는게 있다고 치면 학교중엔 초등학교, 중학교, 고등학교, 대학교 이렇게 4가지로 나눠진다.
이렇게 각각 나눠서 활용할때 enum을 사용한다. 등록 방법은 다음과 같이 한다.
(예시로 학교로 하였음)
enum School {
//case elementary
//case middle
//case high
// 이렇게 표현해도 되지만 간단하게 아래처럼 표현하자.
case elementary, middle, high
}
enum은 이렇게 등록하면 된다. 그럼 등록을 했으니 활용을 해보자
let mySchool = School.high
print("내 학교는: \(mySchool)")
print("내 학교는: ", mySchool)
스위프트 에서 let과 var의 차이점은 나중에 변경 가능하냐 불가능 하냐의 차이다.
var는 변수(변경 가능), let은 상수(변경 불가)라는 뜻.
그리고 위 두 가지 표현은 서로 같은 말이다.
학교하면 이제 학년을 정해야한다. 학년을 똑같이 정해보자
enum Grade : Int {
case first = 1
case second = 2
}
엥? 왜 이건 위에랑 다르게 설정하나요?
enum은 값을 가질 수 있다. 처음에 설정 한 것은 값은 없고 케이스만 나눠논 것이고 값은 설정 하지 않았다. 굳이 하자면 : String 같이 할 수도 있다.
학교와 학년을 설정했으니 출력해보자.
let myGrade = Grade.second
print("내 학년은? -> \(myGrade.rawValue)")
rawValue는 뭡니까?
-> 그냥 (myGrade)로 했다면 아마 출력값은 내 학년은? -> second 라고 나왔을 것이다. 나는 second에 지정된 값을 가져오고 싶었다. 그럴 경우 위에 처럼 .rawValue를 한다면 설정된 값이 나온다.
이번엔 다른걸 한번 해보자.
enum schoolDetail {
case elementary(name: String)
case middle(name: String)
case high(name: String)
}
위에선 Grade의 값을 가져오기 위해 rawValue라는 걸 사용했지만 이번엔 조금 다르다.
위에 문이 뭔 말이냐면 우리가 elementary라는 케이스를 지정할때 데이터도 정해줄 수 있다는 말이다.
let myMiddleSchoolName = SchoolDetail.middle(name: "동산중학교")
print("myMiddleSchoolName : \(myMiddleSchoolName)")
(let 부분) -> middle은 선택했는데 name어떤 데이터를 넣을거에요?
음... "동산중학교"로 넣겠습니다~
출력하면 myMiddleSchoolName : middle(name: "동산중학교") 이렇게 나온다.
출력 모양이 내가 원한게 아니다. 나는 딱 ""안에 값만 나오게 하고싶다. 동시에
내가 값을 입력하고도 싶지 않다 그럼 어떻게 할 수 있을까?
정답은 enum안에 함수를 하나 만들어서 그것을 이용하는 것이다. 한번 해보자.
enum SchoolDetail {
case elementary(name: String)
case middle(name: String)
case high(name: String)
func 불러오기() -> String {
switch self {
case .elementary(let name): //first sol
return name
case let .middle(name): // second sol
return name
case let .high(name):
return name
}
}
}
이게 뭔말이냐?
self는 또 뭐냐?
-> 먼저 편의를 위해 함수 이름을 불러오기라고 명했다. swift는 함수를 만들때 func을 사용한다.
func (함수 이름) ->(반환이라는 말) (반환타입) {...} 이런식으로 하는데
위에 코드를 보면 func 불러오기 -> String{...} 임을 알 수 있다.
또 swift는 타입을 정할때 무.조.건 맨 앞은 대문자로 해야한다. 개인적으로 이게 정말 싫다.
물론 보기엔 편하다만 쓰기엔 거슬려
schoolDetail이라는 이름의 enum안에 불러오기라는 함수를 만들어 가지게 했다. 이것으로 enum이 가지고 있는 각각의 케이스(초,중,고등학교) 값을 함수를 이용해서 가져오게 할 수 있다.
나 자신을 불러오는 것이기 때문에 self라는 것을 이용하는데 위에 코드를 보면 스위치 문에 붙은걸 볼 수 있다.
switch self를 사용해서 내가 초등학교, 중학교, 고등학교일때 라는 가정을 만들어 주자.
내가(schoolDetail) 만약 초,중,고 일때(swicth self { case.초,중,고: ...} ~~을 하겠다(return name).
내가 처음에 name에 값을 넘겨주었고(동산중학교) 이것을 받아오는 방법이 두 가지가 있는데
1. case .elementary(let name):
2. case let .elementary(name):
이런 식으로 let의 사용 방법이 두가지가 있다.
이 상태로 그냥 실행하면 myMiddleSchoolName : middle(name: "동산중학교")로 나오는데 이렇게 하지말고 안에 동산중학교만 나오게 하고 싶을 경우 아래와 같이 하면 된다.
print("내 중학교 이름은: \(myMiddleSchoolName.불러오기())")
그럼 내 중학교 이름은: 동산중학교 이렇게 내가 의도한 대로 나오게 된다.
처음에 이게 뭔 말인지 햇갈렸지만 계속 보다보면 이해가 되더라.