728x90
열거형
- 열거형은 관련된 값으로 이루어진 그릅을 공통의 형으로 선언해 형 안전성(type-safety)을 보장하는 방법으로 코드를 다룰 수 있게 해줌.
- case값이 string,character,integer,floating 값들을 사용 가능
- 열거형 1급 클래스 형이어서 계산된 프로퍼티를 제공하거나 초기화를 지정하거나,초기 선언을 확장해 사용
- enum키워드를 사용해 열거형을 정의
- enum CompassPoint { case north case south case east case west } // 콤마로 구분 가능 enum Planet { case mercury, venus, earth, mars, jupiter, saturn, uranus, neptune }
- Swift에서 열거형은 생성될 때 각 case 별로 기본 integer값을 할당하지 않음
- 각 열거형 정의는 완전 새로운 형(type)을 정의합니다. Swift의 다른 형(types)과 마찬가지로 형의 이름은 대문자로 (CompassPoint나 Planet 같이) 시작
- var directionToHead = CompassPoint.west
- directionToHead의 형은 초기화 될 때 타입추론이 돼서 CompassPoint형을 갖게 됨
- 다음부터 값을 할당할 때 형을 생략함, 축약형 문법 사용 가능
- directionToHead = .east
Switch 구문에서 열거형 값 매칭하기
(Matching Enumeration Values with a Switch Statement)
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 rises")
case .west:
print("Where the skies are blue")
}
// Prints "Watch out for penguins"
witch문은 반드시 열거형의 모든 경우(cases)를 완전히 포함
약 열거형의 모든 cases의 처리를 기술하는게 적당하지 않다면 기본(default) case를 제공함으로써 처리되지 않는 case를 피할 수 있움
관련 값 (Associated Values)
- 열거형의 각 case에 custom type의 추가적인 정보를 저장-
예를 들어 바코드가 위와 같이 4가지 구분으로 이루어진 숫자로 이루어진 종류가 있거나, 2,953개의 문자로 구성된 QR코드 형태로 이루어진 두 가지 종류가 있다면 이 바코드를 아래와 같은 열거형으로 정의
- 바코드 선언
- enum Barcode { case upc(Int, Int, Int, Int) case qrCode(String) } var productBarcode = Barcode.upc(8, 85909, 51226, 3) productBarcode = .qrCode("ABCDEFGHIJKLMNOP")
- 관련 값은 switch case문에서 사용할 때 상수 혹은 변수로 선언
- 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).") } // Prints "QR code: ABCDEFGHIJKLMNOP."
Raw 값 (Raw Values)
- case에 raw 값을 지정
- String, Character, Integer,Float등의 형을 사용 가능
- enum ASCIIControlCharacter: Character { case tab = "\\t" case lineFeed = "\\n" case carriageReturn = "\\r" }
암시적으로 할당된 Raw 값 (Implicitly Assigned Raw Values)
- 열거형을 다루면서 raw값으로 Integer나 String 값을 사용할 수 있는데, 각 case별로 명시적으로 raw값을 할당할 필요X
- raw값을 할당하지 않으면 Swift에서 자동으로 값을 할당
- //mercury에 1을 raw 값으로 명시적으로 할당했고 venus는 암시적으로 2 그리고 이후 값은 1증가 된 값을 자동으로 raw값으로 갖음 enum Planet: Int { case mercury = 1, venus, earth, mars, jupiter, saturn, uranus, neptune } enum CompassPoint: String { case north, south, east, west } let earthsOrder = Planet.earth.rawValue // earthsOrder is 3 let sunsetDirection = CompassPoint.west.rawValue // sunsetDirection is "west"
Raw 값을 이용한 초기화 (Initializing from a Raw Value)
- raw값을 이용해 열거형 변수를 초기화 가능
- raw값 7을 갖는 값을 열거형 변수의 초기 값으로 지정
- let possiblePlanet = Planet(rawValue: 7) // possiblePlanet is of type Planet? and equals Planet.uranus
- raw 값 초기자는 모든 raw값에 대해 열거형 case를 반환이 보장되지 않으므로 실패할 수 있는 초기자(failable initializer)
- 만약 열거형에 지정된 raw값이 없는 값으로 초기자를 지정하면 그 값은 nil
- let positionToFind = 11 if let somePlanet = Planet(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)") } // Prints "There isn't a planet at position 11" // positionToFind 값에 해당하는 Planet case가 존재하지 않는다면, if let 구문이 nil을 반환하고 else 블록이 실
재귀 열거자 (Recursive Enumerations)
- 재귀 열거자는 다른 열거 인스턴스를 관계 값으로 갖는 열거형
- 재귀 열거자 case는 앞에 indirect키워드를 붙여 표시
모르는 용어
형 안전성(type-safety)
- 데이터의 유형을 명확하게 정의(변수, 상수, 함수 및 메서드의 매개변수 등등) 문법
- 코드의 안정성과 유지 보수성 향상 , 버그를 미리 방지
프로퍼티(property)
- 값을 저장하는데 사용되는 변수인데 객체지향프로그래밍(class, struct, enum)안에서 선언되는 변수와 상수
- 저장 프로퍼티
- 값을 저장하는데 사용되는 프로퍼티 변수와 유사
- 연산 프로퍼티
- 값을 저장하지 않고, 계산된 값을 반환 ,
- get 키워드(읽기), set 키워드(쓰기)
- 프로퍼티 감시자(Property observe)
- 프로퍼티 값이 변경될 때 특정 잡을 수행
- willSet(프로퍼티 값 변경전), didset(프로퍼티 값 변경후)
- 저장 프로퍼티
타입추론(Type Inference)
- 컴파일러가 변수나 상수의 데이터 타입을 지정하지 않아도 알아서 추론
- 코드의 가독성, 유지보수성 향상
Raw Value
- 미리 정의된 고정 값
- enum Dirction: “Stirng ” 이부분
초기자(Initializer)
- 인스턴스를 생성하고 초기화하는 메서드
- 객체(저장 프로퍼티 var,let)는 초기화를 거쳐야 사용 → initializer에 의해 초기화
indirect
- enum은 기본 type을 가지고 있음, 하지만 enum안에 enum 사용이 가능한데 그때 사용
**indirect**
- enum은 기본 type을 가지고 있음, 하지만 enum안에 enum 사용이 가능한데 그때 사용
```swift
enum ArithmeticExpression {
case number(Int)
indirect case addition(ArithmeticExpression, ArithmeticExpression)
indirect case multiplication(ArithmeticExpression, ArithmeticExpression)
}
indirect enum ArithmeticExpression {
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(product))
// Prints "18"
```
728x90
'기타 > Today I Learned' 카테고리의 다른 글
[TIL] Swift 문법 메소드(Methods) (0) | 2023.04.28 |
---|---|
[TIL] Swift 문법 클래스와 구조체 (0) | 2023.04.27 |
[TIL] Swift 문법 클로저(Closures) (0) | 2023.04.23 |
[TIL] Swift 문법(함수 Functions) (1) | 2023.04.23 |
[TIL] Swift 제어문 (1) | 2023.04.22 |