develop
Enumeration 본문
반응형
enum 기본으로 아래와 같이 사용할 수 있다.
enum CompassPoint {
case north
case south
case east
case west
}
아래와 같이 case를 생략 할 수 있다.
enum CompassPoint {
case north, south, east, west
}
아래와 같이 enum의 값을 가져올 수 있다.
let value = CompassPoint.north
RawValue
enum CompassPoint: Int {
case north, south, east, west
}
print(CompassPoint.north.rawValue)
print(CompassPoint.south.rawValue)
0
1
제일 앞의 값은 0부터 시작한다.
RawValue에 초기값을 줄수 있다.
제일 앞의 값을 바꿀 수 있다.
enum CompassPoint: Int {
case north = 5
case south, east, west
}
print(CompassPoint.north.rawValue)
print(CompassPoint.south.rawValue)
5
6
값을 각각 줄 수 있다.
enum CompassPoint: Int {
case north = 5
case south = 7
case east = 9
case west = 2
}
print(CompassPoint.north.rawValue)
print(CompassPoint.south.rawValue)
print(CompassPoint.east.rawValue)
print(CompassPoint.west.rawValue)
5
7
9
2
Int가 아닌 다른값으로 RawValue를 줄수 있다.
enum CompassPoint: String {
case north = "동"
case south = "서"
case east = "남"
case west = "북"
}
print(CompassPoint.north.rawValue)
print(CompassPoint.south.rawValue)
print(CompassPoint.east.rawValue)
print(CompassPoint.west.rawValue)
동
서
남
북
RawValue값은 중복되면 안된다.
Associated Value (연관 값)
예를 들어 그림판에 그리기를 할 수 있는 앱을 만들려고 한다.
화면에 터치했을때 그리기, 지우개, 스포이드, 도형 타입이 있다.
enum Draw {
case pen
case eraser
case spoid
case shape
}
이런 식으로 나타낼 수 있다.
펜은 컬러, 사이즈
지우개는 사이즈
도형은 여러 도형타입들이 있다고 했을때 Associated Value를 사용할 수 있다.
enum Draw {
case pen(size: CGFloat, color: UIColor)
case eraser(size: CGFloat)
case spoid
case shape(type: String)
}
let pen = Draw.pen(size: 5, color: .red)
도형도 enum으로 나타낼 수 있다.
enum Shape {
case line
case square
case circle
}
enum Draw {
case pen(size: CGFloat, color: UIColor)
case eraser(size: CGFloat)
case spoid
case shape(type: Shape)
}
let drawType = Draw.pen(size: 5, color: .red)
이렇게 pen을 만들었는데 pen의 size와 color를 가져오려면 아래와 같이 switch로 가져올수 있다.
switch drawType {
case .pen(let size, let color):
print("pen -> size: \(size), color: \(color)")
case .eraser(let size):
print("eraser -> size: \(size)")
case .spoid:
print("spoid")
case .shape(let shape):
print("shape -> \(shape)")
}
pen -> size: 5.0, color: UIExtendedSRGBColorSpace 1 0 0 1
if case로도 가져올수 있다.
if case let .pen(size, color) = drawType {
print("size: \(size), color: \(color)")
}
enum 비교
let line = Shape.line
let line2 = Shape.line
print(line == line2)
이렇게 단순한 enum은 비교가 가능하다.
하지만 Associated Value가 들어간 enum은 기본적인 ==으로 비교할수 없다.
==를 직접 만들어서 비교할 수 있다.
enum Draw {
case pen(size: CGFloat, color: UIColor)
case eraser(size: CGFloat)
case spoid
case shape(type: Shape)
static func ==(lhs: Draw, rhs: Draw) -> Bool {
switch (lhs, rhs) {
case let (.pen(size1, color1), .pen(size2, color2)):
return size1 == size2 && color1 == color2
case let (.eraser(size1), .eraser(size2)):
return size1 == size2
case (.spoid, .spoid):
return true
case let (.shape(type1), .shape(type2)):
return type1 == type2
default:
return false
}
}
}
let pen = Draw.pen(size: 11, color: .red)
let spoid = Draw.spoid
print(pen == spoid)
lhs와 rhs는 Left-hand system, Right-hand system이란 뜻이다.
Property
enum Shape: String {
case line = "라인"
case square = "사각형"
case circle = "원"
}
enum Draw {
case pen(size: CGFloat, color: UIColor)
case eraser(size: CGFloat)
case spoid
case shape(type: Shape)
var title: String {
switch self {
case .pen:
return "펜"
case .eraser:
return "지우개"
case .spoid:
return "스포이드"
case .shape(let type):
return type.rawValue
}
}
}
이렇게 enum에서 Property를 만들수 있고 method나 class도 만들수 있다.
반응형
'iOS' 카테고리의 다른 글
ARC(Automatic Reference Counting) (0) | 2021.01.05 |
---|---|
Escaping noescaping (0) | 2021.01.04 |
Subscript Optional (0) | 2021.01.02 |
Subscript (0) | 2021.01.01 |
Swizzling (0) | 2020.12.31 |
Comments