Swift :: Enum 알아보기 (응용편)
안녕하세요! 상어입니다.
이전엔 Enum의 기초편을 작성했는데 오늘은 응용편을 작성해볼 거에요~
Enum이 뭐지? 싶으신 분들은 기초편을 먼저 보고 오시면 이해가 더 쏙쏙 될거에욤!!!
응용으로는 enum의 연관값과 제네릭 활용을 해볼까합니다.
그럼 살펴보러 꼬꼬~
enum Animal { case dog case cat case rabbit case etc(String) } let animal = Animal.etc("호랑이") switch animal{ case .dog: print("개 입니다.") case .cat: print("고양이 입니다.") case .rabbit: print("토끼 입니다.") case .etc(let etcs): print("\(etcs) 입니다.") }
enum에서는 연관값을 넣을 수 있는데, 위 예제에선 etc에 String타입의 연관값을 지정해보았습니다.
그리고 animal에 초기값 세팅을 해주면서 "호랑이"를 연관값으로 설정했습니다.
그러면 최종적으로 console 창에 "호랑이 입니다."가 출력이 될 거에욤 ㅎㅎ
...
음.. 아닛,,! 예제가 쪼금 빈약하다구요?!! 그래서 준비했습니다.
// MARK: - Struct struct Student { let name: String? let birth: String? let grade: String? let gender: String? } struct Teacher { let name: String? let job: String? } // MARK: - Enum enum School { case students(Student) case teachers(Teacher) } // MARK: - Public func printStudent(_ student: Student) { guard let name = student.name, let birth = student.birth, let grade = student.grade, let gender = student.gender else { return } print("이름 : \(name), 생년월일 : \(birth), 학년 : \(grade), 성별 : \(gender) ") } func printTeacher(_ teacher: Teacher) { guard let name = teacher.name, let job = teacher.job else { return } print("선생님 성함 : \(name), 선생님 과목 : \(job)") } // MARK: - Property
// student 초기값 설정 let shark = Student(name: "상어", birth: "1999.02.27", grade: "3", gender: "여")
// teacher 초기값 설정 let candy = Teacher(name: "캔디", job: "수학") var student: School? { didSet {
// students case의 연관값을 받아옵니다. guard case .students(let student)? = student else { return } printStudent(student) } } var teacher: School? { didSet {
// teachers case의 연관값을 받아옵니다. guard case .teachers(let teacher)? = teacher else { return } printTeacher(teacher) } } student = School.students(shark) // 이름 : 상어, 생년월일 : 1999.02.27, 학년 : 3, 성별 : 여 teacher = School.teachers(candy) // 선생님 성함 : 캔디, 선생님 과목 : 수학
연관값 타입으로는 String, Int같은 기본 데이터 타입도 가능하지만
struct이나 enum도 가능하기 때문에 연관값 타입이 struct인 예제를 만들어보았어욤 ㅎㅎ
var student: School? { didSet { guard case .students(let student)? = student else { return } printStudent(student) } } student = School.students(shark)
이것은
pirntStudent(student)
와 같은거에요~. 그저 didSet을 보여주기 위한 예제이니 꼭 이렇게 사용하지 않으셔도 됩니다 :)
이제 enum의 연관값에 대해 조금 이해 되셨나요?
그럼 추가로 제네릭을 enum에 활용한 예제를 보여드리겠습니다.
enum Result {
case success(T) case failure } protocol ColorProtocol { // 이때 리턴 타입을 원하는 데이터타입으로 설정해주면 됩니다. func getColor() -> Result<String> } extension ColorProtocol { func printColor() { switch getColor() { case .success(let color): print("색은 \(color)색이에요~") case .failure: print("어머! 색이 아니네요!") } } } class SharkColor: ColorProtocol { func getColor() -> Result<String> { return .success("빨강") } } class NoColor: ColorProtocol { func getColor() -> Result<String> { return .failure } } SharkColor().printColor() // 색은 빨강색이에요~ NoColor().printColor() // 어머! 색이 아니네요!
저같은 경우 enum에 제네릭 활용은 alamofire에서 response가 success일 때와, fail일 때를 처리하기 위해 많이 사용합니다.
success일 때 response타입을 제네릭으로 만들어 놓으면 그 어떤 값이 들어와도 상관없으니 편리하더라구용 ㅎㅎ
이렇게 정리하니까 저에게도 정말 많은 공부가 되었네요!
그럼 많은 분들에게 도움이 되었기를 바라며..
안뇽!