본문 바로가기
Xcode/Swift - PlayGround

PlayGround) Enum & Generics 에 대해서 알아보자!

by 후르륵짭짭 2020. 8. 3.
728x90
반응형

안녕하세요 후르륵짭짭 입니다

이번에는 Enum과 Generics에 대해서 기초적인 것을 알아보고

이 둘을 각각 사용하는 방법과 

둘을 함께 사용하는 방법을 알려드리도록 하겠습니다

 

** Enum이란? 그리고 기본적 사용방법 **

Enum은 열거형이라고 합니다. 영어로 enumerations 라고 하죠 

그래서 enum으로 불리는 겁니다.

"An enumeration defines a common type for a group of related values and enables you to work with those values in a type-safe way within your code"

즉, 관련된어 있는 그룹으로 묶는 것이라고 정의 되어 있어요. 

enum Company{
    
    case Apple
    case Samsung
    case Google
    case Naver
    
}

var koreaCompany = Company.Apple
koreaCompany
//결과 : Apple

위와 같이 enum을 생성해줍니다. 그리고 (열거형_이름.케이스) 이렇게 하면 하나의 케이스를 가진 스토어프로퍼티가 생깁니다.

func changeEnumeration(_ element : inout Company){
    
    switch element {
  
    case .Apple:
        element = .Samsung
    case .Samsung:
        element = .Apple
    case .Google:
        element = .Naver
    case .Naver:
        element = .Google
    }
    

}

changeEnumeration(&koreaCompany)
koreaCompany
//결과 Samsung

이렇게 Switch 문을 통해서 어떤 열거 아이템인지 확인 할 수 있습니다.

(참고로 : inout으로 하면 주소 값에 접근해서 element의 값이 바뀌게 됩니다.)

 

** Enum 반복문 사용 **

enum Developer : CaseIterable{

    case WEB, IOS, BIGDATA, ANDROID

}

let allCaseOFEnum = Developer.allCases.count
allCaseOFEnum

for singleCase in Developer.allCases{
    print(singleCase)
}

이건 중요한건 아닌데요. case를 매번 생성 할 필요 없이

위에 처럼 한줄로 쭉~ 쓸 수 도 있습니다.

그리고 내용물을 확인 할 때는 CaseIterable이라는 프로토콜을 준수 받아야합니다.

그럼 위에 처럼 반복문 형태로 사용 할 수 있는데,,,, 쓸일이 있을지는 모르겠네요 ㅎㅎㅎ

 

** Enum에 값 할당 하기 **

enum Language{
    case Programming(String)
    case Life(String)
}

var language = Language.Programming("IOS")

switch language {

case .Programming(let word):
    word
case .Life(let word):
    word
}

이 코드를 보면 case Programming(String) 이렇게 되어 있습니다.

이것은 값을 할당 해주는 것이라 생각하면 편합니다. 

즉, Enum.Programming = "IOS" 이렇게 생각하시면 편해요!

그러면 word 부분에 IOS에 할당 되어 있어서 결과 값이 나오게 됩니다,

 

** RawValue 그리고 함수  **

enum Friend : String{
    
    case Steven = "IOS Developer"
    case Ruel = "Singer"
    case Hachimula = "BasketBall Player"
    
    func BestFriend(){
        
        switch self {
        case .Steven:
            print("Steven IS Best Friend")
        default:
            print("That NONO")
        }
        
    }
}

let myFriend = Friend.Hachimula
myFriend.rawValue
myFriend.BestFriend()

이것은 case 부분에 값을 할당 해주는 겁니다.

그런데 이때 String을 상속 받고 있죠. 저런게 필요합니다.

캐릭터면 Character , 정수면  Int,,, 이렇게요

(만약에 할당 안해주면 RawValue 값으로 case 이름이 나옵니다)

그리고 Enum 안에는 Enum 함수를 넣어 줄 수 있씁니다. 

 

** Generic이란 **

제너릭이란, 중복을 방지해주기 위해서 만들어진 놈이라 생각하시면 편합니다!

만약에 두개의 변수를 더해주는 거라 생각해 봅시다.

func plusInt (_ a : Int, _ b : Int) -> Int {
	return a + b	
}

func plusString (_ a : String, _ b : String) -> String {
	return a + b
}

사실 구조는 완전 똑같은데,,, 새롭게 만들어줘야 합니다.  아주 쉣입니다 ㅎㅎㅎ

코딩의 핵심은 중복을 줄이는 거죠

따라서 제너릭이라는 친구가 생긴 겁니다.

만약에 두개의 변수를 Swap 해주는 함수를 예를 들어 설명하겠습니다.

func SwapTwoElement<Gerneric>(_ one : inout Gerneric , _ two : inout Gerneric ){
    
    let temp = one
    one = two
    two = temp
    
}

이 함수를 보면 <T> (_ one : T , _ two : T) 이렇게 되어 있습니다. (여기서 inout은 일부러 뺐습니다.)

T는 C 언어에서 템플릿을 의미하고 Swift에서는 제너릭을 의미합니다.

따라서 T는 어떤 클래스나 프로토콜이 올 수 있다 는 것을 의미합니다.

그리고 T의 이름은 HururuekChapChap 이던지, 여러가지가 될 수 있습니다.

이렇게 위에 처럼 하면 Int, String에 상관 없이 어떤 타입이든 들어 올 수 있습니다.

 

** Enum과 제너릭 **

enum Error<Success, Failure> {
    
    case success(Success)
    case connectionError(Failure)
    
    func printStatus(){
        
        switch self {
            
        case .success(let message):
            print(message)
        case .connectionError(let message):
            print(message)
        }
        
    }
    
}

func setNetwork(_ choice : Bool) -> Error<String,String>{
    
    if choice {
        return .success("통신 성공")
    }
    else{
        return .connectionError("연결 오류")
    }
    
}

setNetwork(false).printStatus()

이제 지금까지 배운 것을 모두 활용해보면 됩니다.

Enum에 제너릭을 선언해줍니다. <Success, failure> 이것은 두개의 타입이 들어 올 수 있음을 알려주는 겁니다.

그리고 success 케이스에는 Success 제너릭이 들어가고 connectionError 케이스에는 Failure 제너릭이 들어갑니다.

그리고 printStatus() 함수에서 값을 나타내줍니다. 

이렇게 하면 Enum 과 제너릭을 같이 해서 만든 겁니다.

어렵지 않죠? 비슷한 것으로 Result<> 가 있죠 ㅎㅎㅎㅎ

 

지금가지 Enum 과 Generics 에 대해서 알아 봤습니다!!

모두모두 즐코코코 하세욧!!

docs.swift.org/swift-book/LanguageGuide/Generics.html

 

728x90
반응형

댓글