class Aclass {
// 구조체인 Bstruct가 저장속성을 하나 가지고 있음
// 그 저장속성은 enum타입인 Cenum타입임
struct Bstruct {
// 열거형이 구조체인 Dstruct를 가지고 있음
enum Cenum {
case aCase
case bCase
struct Dstruct {
}
}
var name: Cenum
}
}
각각의 요소에 접근하기 위해서는 아래와 같이 타입을 정해줘야한다
let aClass: Aclass = Aclass()
// 구조체는 멤버와이즈 이니셜라이즈가 자동구현되기때문에 init함수가 없지만
// 생성자를 이용해서 초기화가 가능하다
// bStruct에 접근하기 위해서는 속성도 Aclass를 타고들어가야한다
let bStruct: Aclass.Bstruct = Aclass.Bstruct(name: .bCase)
let cEnum: Aclass.Bstruct.Cenum = Aclass.Bstruct.Cenum.aCase
let dStruct: Aclass.Bstruct.Cenum.Dstruct
= Aclass.Bstruct.Cenum.Dstruct()
struct BlackjackCard {
// Suit(세트) 열거형
enum Suit: Character {
case spades = "♠"
case hearts = "♡"
case diamonds = "♢"
case clubs = "♣"
}
// 순서(숫자) 열거형
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 Rank.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)
}
}
}
// 어떤 카드도, 순서(숫자)와 세트(Suit)를 가짐
let rank: Rank
let suit: Suit
// (읽기) 계산속성
var description: String {
get {
var output = "\(suit.rawValue) 세트,"
output += " 숫자 \(rank.values.first)"
if let second = rank.values.second {
output += " 또는 \(second)"
}
return output
}
}
}
해석하는 방법
// 타입을 명시적으로 선언(: DateFormatter.Style <- 이부분)하지 않으면
// .full, .medium같이 간결하게 쓰지 못함
// DateFormatter.Style.full이런식으로 써야함
let setting1: DateFormatter.Style = .full
let setting2 = DateFormatter.Style.full
중첩타입은 특정 타입내에서 사용해서 타입간의 연관성을 구분하기 위해 사용한다
만약에 아래와 같이 선언을 했다면
“Style인건 알겠는데 무슨스타일인데?”라는 의문이 들 수 있다
enum Style {
case full
case long
case medium
case none
}
이런경우엔 아래와같이 선언을 해주면 어떤 style인지가 조금은더 명확해진다
struct DateFormatters {
var style: Style
// 중첩타입으로 선언
enum Style {
case full
case long
case medium
case none
}
}