ABOUT ME

Today
Yesterday
Total
  • Swift :: Enum 알아보기 (응용편)
    Swift 2019. 2. 4. 23:38

    안녕하세요! 상어입니다.

    이전엔 Enum의 기초편을 작성했는데 오늘은 응용편을 작성해볼 거에요~

    Enum이 뭐지? 싶으신 분들은 기초편을 먼저 보고 오시면 이해가 더 쏙쏙 될거에욤!!!


    응용으로는 enum의 연관값과 제네릭 활용을 해볼까합니다.

    그럼 살펴보러 꼬꼬~


    1. enum Animal {

    2. case dog

    3. case cat

    4. case rabbit

    5. case etc(String)

    6. }

    7. let animal = Animal.etc("호랑이")

    8. switch animal{

    9. case .dog:

    10. print("개 입니다.")

    11. case .cat:

    12. print("고양이 입니다.")

    13. case .rabbit:

    14. print("토끼 입니다.")

    15. case .etc(let etcs):

    16. print("\(etcs) 입니다.")

    17. }

    enum에서는 연관값을 넣을 수 있는데, 위 예제에선 etc에 String타입의 연관값을 지정해보았습니다.

    그리고 animal에 초기값 세팅을 해주면서 "호랑이"를 연관값으로 설정했습니다.

    그러면 최종적으로 console 창에 "호랑이 입니다."가 출력이 될 거에욤 ㅎㅎ


    ...

    음.. 아닛,,! 예제가 쪼금 빈약하다구요?!! 그래서 준비했습니다.


    1. // MARK: - Struct

    2. struct Student {

    3. let name: String?

    4. let birth: String?

    5. let grade: String?

    6. let gender: String?

    7. }

    8. struct Teacher {

    9. let name: String?

    10. let job: String?

    11. }

    12. // MARK: - Enum

    13. enum School {

    14. case students(Student)

    15. case teachers(Teacher)

    16. }

    17. // MARK: - Public

    18. func printStudent(_ student: Student) {

    19. guard let name = student.name,

    20. let birth = student.birth,

    21. let grade = student.grade,

    22. let gender = student.gender

    23. else { return }

    24. print("이름 : \(name), 생년월일 : \(birth), 학년 : \(grade), 성별 : \(gender) ")

    25. }

    26. func printTeacher(_ teacher: Teacher) {

    27. guard let name = teacher.name,

    28. let job = teacher.job

    29. else { return }

    30. print("선생님 성함 : \(name), 선생님 과목 : \(job)")

    31. }

    32. // MARK: - Property

    33. // student 초기값 설정

    34. let shark = Student(name: "상어",

    35. birth: "1999.02.27",

    36. grade: "3",

    37. gender: "여")

    38. // teacher 초기값 설정

    39. let candy = Teacher(name: "캔디",

    40. job: "수학")

    41. var student: School? {

    42. didSet {

      // students case의 연관값을 받아옵니다.

    43. guard case .students(let student)? = student

    44. else { return }

    45. printStudent(student)

    46. }

    47. }

    48. var teacher: School? {

    49. didSet {

      // teachers case의 연관값을 받아옵니다.

    50. guard case .teachers(let teacher)? = teacher

    51. else { return }

    52. printTeacher(teacher)

    53. }

    54. }

    55. student = School.students(shark)

    56. // 이름 : 상어, 생년월일 : 1999.02.27, 학년 : 3, 성별 : 여

    57. teacher = School.teachers(candy)

    58. // 선생님 성함 : 캔디, 선생님 과목 : 수학

    연관값 타입으로는 String, Int같은 기본 데이터 타입도 가능하지만 

    struct이나 enum도 가능하기 때문에 연관값 타입이 struct인 예제를 만들어보았어욤 ㅎㅎ


    1. var student: School? {

    2. didSet {

    3. guard case .students(let student)? = student

    4. else { return }

    5. printStudent(student)

    6. }

    7. }

    8. student = School.students(shark)

    이것은

    1. pirntStudent(student)

    와 같은거에요~. 그저 didSet을 보여주기 위한 예제이니 꼭 이렇게 사용하지 않으셔도 됩니다 :)


    이제 enum의 연관값에 대해 조금 이해 되셨나요?

    그럼 추가로 제네릭을 enum에 활용한 예제를 보여드리겠습니다.


    1. enum Result {

      case success(T)
    2. case failure
    3. }
    4. protocol ColorProtocol {
    5. // 이때 리턴 타입을 원하는 데이터타입으로 설정해주면 됩니다.
    6. func getColor() -> Result<String>
    7. }
    8. extension ColorProtocol {
    9. func printColor() {
    10. switch getColor() {
    11. case .success(let color):
    12. print("색은 \(color)색이에요~")
    13. case .failure:
    14. print("어머! 색이 아니네요!")
    15. }
    16. }
    17. }
    18. class SharkColor: ColorProtocol {
    19. func getColor() -> Result<String> {
    20. return .success("빨강")
    21. }
    22. }
    23. class NoColor: ColorProtocol {
    24. func getColor() -> Result<String> {
    25. return .failure
    26. }
    27. }
    28. SharkColor().printColor()
    29. // 색은 빨강색이에요~
    30. NoColor().printColor()
    31. // 어머! 색이 아니네요!


    저같은 경우 enum에 제네릭 활용은 alamofire에서 response가 success일 때와, fail일 때를 처리하기 위해 많이 사용합니다.

    success일 때 response타입을 제네릭으로 만들어 놓으면 그 어떤 값이 들어와도 상관없으니 편리하더라구용 ㅎㅎ



    이렇게 정리하니까 저에게도 정말 많은 공부가 되었네요!

    그럼 많은 분들에게 도움이 되었기를 바라며..


    안뇽!

    댓글

Designed by Tistory.