8-2. 연관된 값, 원시 값, 재귀 열거형
13582 단어 Swift DocsEnumerationsEnumerations
연관된 값(associated value)
- 경우에 따라서 케이스 값과 함께 다른 타입의 값을 저장할 수 있는 것이 유용할 때가 있다. 이를 연관된 값이라고 하고 케이스를 코드에서 값으로 사용할때마다 달라진다. 아래 예시코드를 통해 확인한다.
enum Barcode {
case upc(Int, Int, Int, Int)
case qrCode(String)
}
//다음의 Barcode라는 열거형은 4자리의 튜플 타입과 연관된 값을 가진 upc나
//String타입의 연관된 값을 가지는 qrCode를 가질 수 있다.
//여기에서 정의는 어떠한 실질적 값을 제공하는 것이 아닌
//Barcode상수와 변수에 저장하는 연관된 값의 타입을 정의하는 것이다.
var productBarcode = Barcode.upc(8, 1, 2, 3)
productBarcode = .qrCode("AFDESA")
//다음과 같이 바코드 타입 할당이 가능하다.
switch productBarcode {
case .upc(let numberSystem, let manufacturer, let product, let check):
print(\(numberSystem))
//만약 여기가 호출되면 8일 출력된다.
case .qrCode(let productCode):
print("QR Code : \(productCode)")
//다음과 같은 경우 "AFDESA"이 값을 출력하게 된다.
//위에서 정의한 케이스가 가질 연관된 값의 타입을 받아서 그대로 변수나 상수에 담아서
//switch구문 내에서 활용이 가능하다.
switch productBarcode {
case let .upc(numberSystem, manufacturer, product, check):
print(\(numberSystem))
//만약 여기가 호출되면 8일 출력된다.
case let .qrCode(productCode):
print("QR Code : \(productCode)")
//비슷한 경우이며, 케이스에 할당된 값에 대해서 스위치 구문에서 사용이 가능하다.
원시값(raw value)
- 위의 연관된 값(Associated Values)는 열거형 케이스에 다른 타입의 연관된 값을 저장한다고 선언하는 방법을 보여줬다. 이에 대한 다른 방법으로 열거형 케이스는 모두 동일한 타입의 기본 값(원시값)을 미리 채울 수 있다.
enum CodeController : String {
case A = "A",
Case B = "B"
}
//다음과 같이 원시값이 가질 타입을 열거형에 선언해주고 케이스에 할당해주면
//해당 값에 rawValue라는 프로퍼티를 통해 접근이 가능하다.
- 암시적 원시값을 가질수도 있다. 아래의 예시에서는 얼거형 원시값을 위해 타입을 설정해 줬을 뿐 별도의 값을 써주지 않았다. 그럼에도 각 케이스는 해당 케이스 명칭을 암시적 원시값으로 가진다.
enum CompassPoint : String {
case north, south, east, west
}
//다음과 같을 때 .north의 원시값은 "north"로 암시적으로 소유되게 된다.
- 원시값 타입으로 열거형 정의 시 열거형은 원시값 타입을 사용하는 초기화를 자동으로 지원한다. 이 초기화를 통해 열거형의 새 인스턴스를 만들 수 있다.
let sunsetDirection = CompassPoint.west.rawValue
//다음과 같이 원시값 프로퍼티를 통해서 값에 접근하고 초기화도 가능하다.
재귀 열거형(recursive enumerations)
- 재귀 열거형은 열거형 케이스에 하나 이상의 연관된 값으로 열거형의 다른 인스턴스를 가지는 열거형이다. 말이 어렵다. 예시를 보면서 이해하자.
enum ArithmeticExpression {
case number(Int)
indirect case addition(ArithmeticExpression, ArithmeticExpression)
indirect case multiplication(ArithmeticExpression, ArithmeticExpression)
}
//다음처럼 열거형 시작전 indirect를 작성하여 연관된 값을 가진 케이스에
//간접적으로 활성화가 가능하다.
let five = ArithmeticExpression.number(5)
let four = ArithmeticExpression.number(4)
let sum = ArithmeticExpression.addition(five, four)
let product = ArithmeticExpression.multiplication(sum, Arithmetic.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 .multipication(left, right):
return evaluate(left) * evaluate(right)
}
}
print(evaluate(product))
//18 을 출력한다.
Author And Source
이 문제에 관하여(8-2. 연관된 값, 원시 값, 재귀 열거형), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://velog.io/@devleeky16498/8-2.-연관된-값-원시-값-재귀-열거형
저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
enum Barcode {
case upc(Int, Int, Int, Int)
case qrCode(String)
}
//다음의 Barcode라는 열거형은 4자리의 튜플 타입과 연관된 값을 가진 upc나
//String타입의 연관된 값을 가지는 qrCode를 가질 수 있다.
//여기에서 정의는 어떠한 실질적 값을 제공하는 것이 아닌
//Barcode상수와 변수에 저장하는 연관된 값의 타입을 정의하는 것이다.
var productBarcode = Barcode.upc(8, 1, 2, 3)
productBarcode = .qrCode("AFDESA")
//다음과 같이 바코드 타입 할당이 가능하다.
switch productBarcode {
case .upc(let numberSystem, let manufacturer, let product, let check):
print(\(numberSystem))
//만약 여기가 호출되면 8일 출력된다.
case .qrCode(let productCode):
print("QR Code : \(productCode)")
//다음과 같은 경우 "AFDESA"이 값을 출력하게 된다.
//위에서 정의한 케이스가 가질 연관된 값의 타입을 받아서 그대로 변수나 상수에 담아서
//switch구문 내에서 활용이 가능하다.
switch productBarcode {
case let .upc(numberSystem, manufacturer, product, check):
print(\(numberSystem))
//만약 여기가 호출되면 8일 출력된다.
case let .qrCode(productCode):
print("QR Code : \(productCode)")
//비슷한 경우이며, 케이스에 할당된 값에 대해서 스위치 구문에서 사용이 가능하다.
- 위의 연관된 값(Associated Values)는 열거형 케이스에 다른 타입의 연관된 값을 저장한다고 선언하는 방법을 보여줬다. 이에 대한 다른 방법으로 열거형 케이스는 모두 동일한 타입의 기본 값(원시값)을 미리 채울 수 있다.
enum CodeController : String {
case A = "A",
Case B = "B"
}
//다음과 같이 원시값이 가질 타입을 열거형에 선언해주고 케이스에 할당해주면
//해당 값에 rawValue라는 프로퍼티를 통해 접근이 가능하다.
- 암시적 원시값을 가질수도 있다. 아래의 예시에서는 얼거형 원시값을 위해 타입을 설정해 줬을 뿐 별도의 값을 써주지 않았다. 그럼에도 각 케이스는 해당 케이스 명칭을 암시적 원시값으로 가진다.
enum CompassPoint : String {
case north, south, east, west
}
//다음과 같을 때 .north의 원시값은 "north"로 암시적으로 소유되게 된다.
- 원시값 타입으로 열거형 정의 시 열거형은 원시값 타입을 사용하는 초기화를 자동으로 지원한다. 이 초기화를 통해 열거형의 새 인스턴스를 만들 수 있다.
let sunsetDirection = CompassPoint.west.rawValue
//다음과 같이 원시값 프로퍼티를 통해서 값에 접근하고 초기화도 가능하다.
재귀 열거형(recursive enumerations)
- 재귀 열거형은 열거형 케이스에 하나 이상의 연관된 값으로 열거형의 다른 인스턴스를 가지는 열거형이다. 말이 어렵다. 예시를 보면서 이해하자.
enum ArithmeticExpression {
case number(Int)
indirect case addition(ArithmeticExpression, ArithmeticExpression)
indirect case multiplication(ArithmeticExpression, ArithmeticExpression)
}
//다음처럼 열거형 시작전 indirect를 작성하여 연관된 값을 가진 케이스에
//간접적으로 활성화가 가능하다.
let five = ArithmeticExpression.number(5)
let four = ArithmeticExpression.number(4)
let sum = ArithmeticExpression.addition(five, four)
let product = ArithmeticExpression.multiplication(sum, Arithmetic.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 .multipication(left, right):
return evaluate(left) * evaluate(right)
}
}
print(evaluate(product))
//18 을 출력한다.
Author And Source
이 문제에 관하여(8-2. 연관된 값, 원시 값, 재귀 열거형), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://velog.io/@devleeky16498/8-2.-연관된-값-원시-값-재귀-열거형
저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
enum ArithmeticExpression {
case number(Int)
indirect case addition(ArithmeticExpression, ArithmeticExpression)
indirect case multiplication(ArithmeticExpression, ArithmeticExpression)
}
//다음처럼 열거형 시작전 indirect를 작성하여 연관된 값을 가진 케이스에
//간접적으로 활성화가 가능하다.
let five = ArithmeticExpression.number(5)
let four = ArithmeticExpression.number(4)
let sum = ArithmeticExpression.addition(five, four)
let product = ArithmeticExpression.multiplication(sum, Arithmetic.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 .multipication(left, right):
return evaluate(left) * evaluate(right)
}
}
print(evaluate(product))
//18 을 출력한다.
Author And Source
이 문제에 관하여(8-2. 연관된 값, 원시 값, 재귀 열거형), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@devleeky16498/8-2.-연관된-값-원시-값-재귀-열거형저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)