반응형

열거형(Enumerations)과 구조체(Structures)를 다룹니다.



A Swift Tour ( https://docs.swift.org/swift-book/GuidedTour/GuidedTour.html  ) 문서의 코드를 Swift Playground(  https://swiftfiddle.com/  ) 에서 실행시켜 보며 진행해보았습니다. 

 

본 문서는 공부한 내용을 정리하는 목적으로 작성되었으며 A Swift Tour 문서의 내용을 바탕으로 하고 있습니다. 잘못된 점이 있을 수 있습니다



2021. 10. 21   최초작성

2021. 11. 02   접속 불가 상태인 Swift Playground 사이트 변경

2022. 10. 22   최종수정

 

enum 키워드를 사용하여 열거형을 생성합니다.

 

enum 다음에 열거형 이름을 적은 후, 콜론 다음에 열거형 타입으로 Int를 적습니다. 

열거형 타입으로 String, Float 등 다른 타입도 가능합니다. 

 

case 다음에 열거형에 포함할 원소들을 입력합니다. 여러 줄의  case에 나누어 적을 수 있습니다.

열거형은 자동으로 앞에 있는 단어부터 0부터 시작하여 1씩 중가하며 정수를 부여합니다.  아래 코드를 예를 들어 one은 0, two는 1입니다.

 

또는 다음처럼 시작 번호를 부여할 수도 있습니다. 

예) case one=1

 

테스트해 본결과 실수의 경우에는 자동으로 번호 부여가 안되는 것으로 보입니다.



열거형이름.원소이름으로 열거형의 원소를 사용할 수 있으며 if문이나 case문에 비교 대상으로 적을시 열거형 이름을 빼고 .원소이름만 적을 수 있습니다. 



아래 예제에서는 변수 t에 대입되어 있는 Rank.two와 .two를 if문에서 비교하여 두 값이 같기때문에 “2입니다”가 출력됩니다.

 

열거형 원소의 rawValue 속성을 사용하여 열거형 원소에 대입된 정수를 확인해볼 수 있습니다. 

Rank.two.rawValue를 출력해보면 1이 출력됩니다. 열거형 Rank의 두번째 원소이기 때문입니다. 

열거형의 원소에 대입되는 정수는 0부터 시작하며 1씩 증가합니다.  

 

enum Rank: Int {
    case one
    case two, three, four, five, six, seven, eight, nine, ten
}

var t = Rank.two

if t == .two
{
    print("2입니다")
}

print(Rank.two.rawValue)

 

 

다음 예제처럼 열거형의 원소에 대응되는 값을 신경쓰지 않고 쓸 수 있습니다.

변수 t에 저장시 열거형 이름을 적었기 때문에 if문에서 비교시에는 열거형 이름을 생략하고 원소이름 앞에 점을 찍어  .dog만 

적을 수 있습니다.

 

변수 t에 있는 값은 .dog와 같기 때문에 실행결과 “개입니다”가 출력됩니다.

enum Animal {
    case dog, cat, duck
}

var t = Animal.dog

if t == .dog
{
    print("개입니다.")
}

 

실행결과 입니다.

 

클래스나 다른 named types처럼 열거형에 메소드를 추가할 수 있습니다. 

특정 열거형 원소의 simpleDescription 메소드를 실행시키면 switch-case문에서 현재 열거형 원소를 확인하여 case문에 있으면 지정한 문자열을 리턴해줍니다.  디폴트값은 열거형의 원소에 대응하는 정수값을 리턴해주는 것입니다. 

enum Rank: Int {
    case ace = 1
    case two, three, four, five, six, seven, eight, nine, ten
    case jack, queen, king

    func simpleDescription() -> String {
        switch self {
        case .ace:
            return "ace0"
        case .jack:
            return "jack0"
        case .queen:
            return "queen0"
        case .king:
            return "king0"
        default:
            return String(self.rawValue)
        }
    }
}

print(Rank.ace)
print(Rank.ace.rawValue)

// switch문에서 .ace에 해당되기 때문에 “ace0”이 출력됩니다.
print(Rank.ace.simpleDescription())


print(Rank.four)

// 열거형 Rank의 ace 원소에 시작 번호로 1로 대입했기때문에 Rank.four.rawValue를 출력해보면 4가 출력됩니다.
print(Rank.four.rawValue)

// switch문에서 해당되는 경우가 없기 때문에 디폴트값인 rawValue인 4가 출력됩니다.
print(Rank.four.simpleDescription())



 

앞에 예제에선 열거형 원소에 정수를 대입했는데  문자열이나 실수를  사용할 수도  있습니다.

 

열거형의 원소중 rawValue: 다음에 지정한 정수값을 가진 것이 있으면 해당 열거형의 원소를  리턴하며 없다면 nil을 리턴합니다.

열거형 원소가 리턴된 경우에만 중괄호안에 있는 코드가 실행됩니다.  

 

enum Animal: Int {
    case dog, cat, duck
}


// 열거형 Animal에 rawValue가 1인 cat이 있기 때문에 cat이 convertedAnimal에 대입되어 중괄호 안에 있는 print문에 의해서 cat이 출력됩니다.
if let convertedAnimal = Animal(rawValue: 1) {

    print(convertedAnimal)
}



// 열거형 Animal에 rawValue가 3인 원소가 없기 때문에 nil이 리턴되며 중괄호 안에 있는 코드가 실행되지 않기 때문에 아무것도 출력되지 않습니다.
if let convertedAnimal = Animal(rawValue: 3) {

    print(convertedAnimal)
}

 

실행 결과입니다.

 

 switch문 내부의 case문에서는 열거형 이름을 빼고  .result나 .failure처럼 원소이름만을 사용할 수 있습니다.  

다음 예제에서는 서버에 요청된 정보로 응답하거나 무엇이 잘못되었는지에 대한 설명으로 응답합니다.

 

열거형 ServerResponse에는 두개의 원소 result와 failure가 있는데 각각  선언시 문자열을 포함시키고 있습니다.

 

열거형 ServerResponse의 result 원소에는 두 개의 시간을 의미하는 문자열을 추가하고

열거형 ServerResponse의 failure 원소에는 에러 원인을 의미하는 문자열을 추가합니다. 

 

enum ServerResponse {
    case result(String, String)
    case failure(String)
}

let success = ServerResponse.result("6:00 am", "8:09 pm")
let failure = ServerResponse.failure("Out of cheese.")


// success가 case let .result(sunrise, sunset):에서 True가 되어 바로 아래 있는 print문이 실행됩니다. 
// 이때 앞에서 result 원소 선언시 입력한 문자열 "6:00 am", "8:09 pm"을  
// case 문의 .result(sunrise, sunset)에서 지정한 이름 sunrise, sunset을 사용하여 받아옵니다.
switch success {
case let .result(sunrise, sunset):
    print("Sunrise is at \(sunrise) and sunset is at \(sunset).")
case let .failure(message):
    print("Failure...  \(message)")
}


// failure가 case let .failure(message):에서 True가 되어 바로 아래 있는 print문이 실행됩니다. 
// 이때도 앞에 경우와 마찬가지로 failure 원소 선언시 입력한 문자열 "Out of cheese."을 
// case 문의 .failure(message)에서 지정한 이름 message를 사용하여 받아옵니다.
switch failure {
case let .result(sunrise, sunset):
    print("Sunrise is at \(sunrise) and sunset is at \(sunset).")
case let .failure(message):
    print("Failure...  \(message)")
}




struct를 사용하여 구조체를 만듭니다. 구조체는 메서드 및 이니셜라이저를 포함하여 클래스와 동일한 동작을 많이 지원합니다.

구조체와 클래스의 가장 중요한 차이점 중 하나는 구조체가 코드에서 전달될 때 항상 복사되지만 클래스는 참조로 전달된다는 것입니다.

 

enum Rank {
    case ace
    case two, three, four, five
}

enum Suit {
    case spades, hearts, diamonds, clubs
}

struct Card {

    var rank: Rank
    var suit: Suit

    func simpleDescription() -> String {
        return "The \(rank) of \(suit)"
    }
}

let threeOfSpades = Card(rank: .two, suit: .spades)

let threeOfSpadesDescription = threeOfSpades.simpleDescription()
print(threeOfSpadesDescription)

 




Swift 강좌 1 - Hello, world

https://webnautes.tistory.com/1549



Swift 강좌 2 - 상수와 변수

https://webnautes.tistory.com/1550



Swift 강좌 3 - 제어문 : if, for - in, switch, repeat - while

https://webnautes.tistory.com/1551



Swift 강좌 4 - 함수

https://webnautes.tistory.com/1552



Swift 강좌 5 - 객체(Objects)와 클래스(Classes)

https://webnautes.tistory.com/1558



Swift 강좌 6 - 열거형(Enumerations)과 구조체(Structures)

https://webnautes.tistory.com/1559



Swift 강좌 7 - 프로토콜(Protocols)과 익스텐션(Extensions)

https://webnautes.tistory.com/1562



Swift 강좌 8 - 에러 처리(Error Handling)

https://webnautes.tistory.com/1566



Swift 강좌 9 - 제네릭(Generics)

https://webnautes.tistory.com/1568

 

문제 발생시 지나치지 마시고 댓글 남겨주시면 가능한 빨리 답장드립니다.


제가 쓴 책도 한번 검토해보세요 ^^

+ Recent posts