티스토리 뷰
[Swift 문법] Swift 공식 문서 정리 - 19 - Nested Types(중첩 타입)
Dev_Pingu 2020. 8. 15. 11:27이번 글에서는 Swift 공식 문서의 19번째 단원인 Nested Types을 읽고 정리한 글을 쓰려고 한다.
Apple Swift 공식 문서 19단원 - Nested Types
Nested Types
열거형은 가끔 특정 클래스와 구조체의 기능을 지원하기 위해 생성된다. 이와 비슷하게 복잡한 타입의 클래스와 구조체를 사용할 때 그 안에서 모든 것을 구현하는 것이 편리할 수 있다. 즉 해당 블록 안에 또 다른 열거형, 클래스, 구조체를 중첩해서 정의할 수 있다는 말이다. 다른 타입 내에 타입을 중첩하려면 지원하는 타입의 외부 중괄호 안에 정의를 작성하면 된다.
Nested Types in Action
struct BlackjackCard {
// nested Suit enumeration
enum Suit: Character {
case spades = "♠", hearts = "♡", diamonds = "♢", clubs = "♣"
}
// nested Rank enumeration
enum Rank: Int {
case two = 2, three, four, five, six, seven, eight, nine, ten
case jack, queen, king, ace
struct Values {
let first: Int, second: Int?
}
var values: Values {
switch self {
case .ace:
return Values(first: 1, second: 11)
case .jack, .queen, .king:
return Values(first: 10, second: nil)
default:
return Values(first: self.rawValue, second: nil)
}
}
}
// BlackjackCard properties and methods
let rank: Rank, suit: Suit
var description: String {
var output = "suit is \(suit.rawValue),"
output += " value is \(rank.values.first)"
if let second = rank.values.second {
output += " or \(second)"
}
return output
}
}
위의 코드가 중첩 타입을 사용하는 예제 코드이다. 이 코드는 블랙잭 게임을 나타내는 것으로 카드를 나타내는 BlackjackCard라는 구조체가 정의되어 있다. 이 구조체 안에는 Suit, Rank 열거형이 중첩 타입으로 정의되어있다. 비교적 간단한 Suit 열거형은 직관적으로 이해할 수 있으니 넘어가도록 하고 Rank 열거형을 살펴보자. 참고로 여기서 Suit 열거형은 카드의 모양을 나타낸다.
Rank 열거형은 카드의 숫자값을 나타내는 값이다. Rank 열거형 안에는 Values 구조체가 또 다른 중첩 타입으로 정의되어있다. 이는 예를 들어 ace 카드는 1, 11로 사용될 수 있는데 이러한 경우를 표현하기 위한 구조체이다. 이를 계산 프로퍼티인 values에서 각 값에 맞게 계산해주면 된다. 예시로 사용된 ace카드를 들어보자. BlackjackCard의 프로퍼티인 description에서 만약 Rank가 ace라면 Rank의 Values 구조체에 first, second 값에 1, 11이 할당된다. 이를 사용하여 description 프로퍼티를 구성하게 되는데 second 값은 옵셔널 타입이므로 없으면 처리되지 않는다. 하지만 ace는 가지고 있기 때문에 처리되어 결과가 나오게 된다.
let theAceOfSpades = BlackjackCard(rank: .ace, suit: .spades)
print("theAceOfSpades: \(theAceOfSpades.description)")
// Prints "theAceOfSpades: suit is ♠, value is 1 or 11"
Referring to Nested Types
콘텍스트 외부에서 중첩된 타입을 사용하려면 해당 이름에 중첩된 타입의 이름을 접두사로 붙여야 한다.
let heartsSymbol = BlackjackCard.Suit.hearts.rawValue
// heartsSymbol is "♡"
위의 예처럼 이름이 정의된 콘텍스트에 따라 자연스럽게 규정되기 때문에 Suit, Rank, Values의 이름을 짧게 유지할 수 있다.
'Swift > Swift_Documents' 카테고리의 다른 글
[Swift 문법] Swift 공식 문서 정리 - 22 - Generics (제네릭) (0) | 2020.08.23 |
---|---|
[Swift 문법] Swift 공식 문서 정리 - 20 - Extensions (익스텐션) (0) | 2020.08.15 |
[Swift 문법] Swift 공식 문서 정리 - 18 - Type Casting(타입 캐스팅) (0) | 2020.08.14 |
[Swift 문법] Swift 공식 문서 정리 - 17 - Error Handling (에러 처리) (1) | 2020.08.12 |
[Swift 문법] Swift 공식 문서 정리 - 16 - Optional Chaining (옵셔널 체이닝) (0) | 2020.08.11 |
- Total
- Today
- Yesterday
- 백준
- Combine
- Xcode
- dfs
- 테이블뷰
- DP
- OSTEP
- 코딩테스트
- BFS
- 자료구조
- 알고리즘
- Publisher
- Swift
- 스위프트
- 아이폰
- operator
- 문법
- operating
- Apple
- document
- 동시성
- pattern
- mac
- IOS
- 프로그래밍
- System
- design
- 앱개발
- 코테
- OS
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |