17. Enumerations

2016. 11. 19. 12:33Swift

// Enumerations

// Enumeration Syntax

// enum SomeEnumeration {

//    // enumeration definition goes here

// }


enum CompassPoint {

    case north

    case south

    case east

    case west

}


enum Planet {

    case mercury, venus, earth, mars,

         jupiter, saturn, uranus, neptune

}


var directionToHead = CompassPoint.west


directionToHead = .east


directionToHead = .south


switch directionToHead {

case .north:

    print("Lots of planets have a north")

case .south:

    print("Watch out for penguins")

case .east:

    print("Where the sun rise")

case .west:

    print("Where the skies are blue")

}


let somePlanet = Planet.earth


switch somePlanet {

case .earth:

    print("Mostly harmless")

default:

    print("Not a safe place for humans")

}



// Associated Values

enum Barcode {

    case upc(Int, Int, Int, Int)

    case qrCode(String)

}


var productBarcode = Barcode.upc(8, 85909, 51226, 3)


productBarcode = .qrCode("ABCDEFGHIJKLMNOP")


switch productBarcode {

case .upc(let numberSystem, let manufacturer, let product, let check):

    print("UPC: \(numberSystem), \(manufacturer), \(product), \(check).")

case .qrCode(let productCode):

    print("QR code: \(productCode)")

}


// 데이터형을 앞으로 빼서 간결하게 만들 있다.

switch productBarcode {

case let .upc(numberSystem, manufacturer, product, check):

    print("UPC: \(numberSystem), \(manufacturer), \(product), \(check).")

case let .qrCode(productCode):

    print("QR code: \(productCode)")

}


//Raw Values


enum ASCIIControlCharacter: Character {

    case tab = "\t"

    case lineFeed = "\n"

    case carriageReturn = "\r"

}


enum Planet1: Int {

    case mercury = 1, venus, earth, mars, jupiter, saturn, uranus, neptune

}


enum CompassPoint1: String {

    case north, south, east, west

}


let earthsOrder = Planet1.earth.rawValue


let sunsetDirection = CompassPoint1.west.rawValue

let sunsetDirection_hash = CompassPoint1.west.hashValue


let possiblePlanet = Planet1(rawValue: 7)


let positionToFind = 3


if var somePlanet = Planet1(rawValue: positionToFind) {

    switch somePlanet {

    case .earth:

        print("Mostly harmless")

    default:

        print("Not a safe place for humans")

    }

} else {

    print("There isn't a planet at Position \(positionToFind)")

}



// Recursive Enumerations


enum ArithmeticExpression {

    case number(Int)

    indirect case addition(ArithmeticExpression, ArithmeticExpression)

    indirect case multiplication(ArithmeticExpression, ArithmeticExpression)

}


indirect enum ArithmeticExpression1 {

    case number(Int)

    case addition(ArithmeticExpression, ArithmeticExpression)

    case multiplication(ArithmeticExpression, ArithmeticExpression)

}


let five = ArithmeticExpression.number(5)

let four = ArithmeticExpression.number(4)

let sum = ArithmeticExpression.addition(five, four)

let product = ArithmeticExpression.multiplication(sum, ArithmeticExpression.number(2))

func evaluate(_ expression: ArithmeticExpression) -> Int {

    switch expression {

    case let .number(value):

        return value

    case let .addition(left, right):

        return evaluate(left) + evaluate(right)

    case let .multiplication(left, right):

        return evaluate(left) * evaluate(right)

    }

}


print(evaluate(sum))

print(evaluate(product))


출처 : The Swift Programming Language(iBook)