티스토리 뷰
c언어 할 때부터 enum을 안쓰다싶이 했더니, 아예 enum이랑 멀어진것같다.
하지만 enum은 꼭 필요한 존재인걸....
그리고 swift의 enum은 너어어어무 헷깔린다. enum 종류를 왜 case로 표현할까...정말 마음에 안든다ㅠㅠ
1. 정의
enum Weather{
case sunny
case rainy
}
뭐 이런식으로 쓰면 된다.
enum Weather {
case sunny, rainy
}
이렇게 한줄로 정의해도 된다고 한다!!!
2. enum을 활용한 switch문
switch문은 if else의 대행같은거라고 생각하면 될듯.
switch weather{
case .sunny
case .rainy
default
}
이렇게 쓰면 된다.
3. enum에 함수 넣기
" 열거 타입은 Swift내에서 일급 클래스로 취급되며, 클래스가 가지는 계산 프로퍼티나 메소드를 포함하는 것도 가능하며,
이니셜라이저를 가지거나 확장도 할 수 있으며 따라서 프로토콜을 따르도록 정의될 수 있다. "
헐... swift의 enum은 C에서의 단순 타입과는 명백하게 다르다.
함수도 넣을 수 있다!!!
enum HTTPCode: Int {
case OK = 200
case NOT_MODIFY = 304
case SERVER_ERROR = 500
var value: String {
return "HTTP number is \(self.rawValue)"
}
func getDescription () -> String {
switch self {
case .OK :
return "HTTP 코드는 \(self.rawValue)" 입니다
}
....
}
static func getName() -> String {
return "이건 HTTPCode야~~"
}
}
4. 연관값
" 연관값은 열거 내의 하나의 사례에 대해 각 사례 인스턴스마다 다른 값들을 가지게 하고 싶을 때 사용한다.
이는 개별 사례와 함께 임의의 값들을 함께 저장하게 하여 일반 스칼라 타입의 값들보다 강력하고 엄격한 타입 구분을 적용하면서 매우 유연하게 사용할 수 있게 해준다. "
@.@ 뭔소린지 하나도 모르겠다.
enum Barcode {
case upc(Int, Int, Int, Int)
case qrCode(String)
}
이런 Barcode 타입을 만들어두면, 얘가 (Int, Int, Int, Int)타입이던, (String)타입이던 상관없이 Barcode로 쓸 수 있다는게 의의 같다.
var productBarcode = Barcode.upc(3, 25, 153, 9)
productBarcode = .qrCode("helloworld")
switch productBarcode {
case .upc(let a, let b, let c, let d):
print("UPC: \(a), \(b), \(c), \(d)")
case let .qrCode(message):
print("QRCode: \(message)")
}
?? 근데 case let은 뭐지 ???
case let으로 쓰면,
case .으로 쓴것과 달리 인자들에 let a, 이런식으로 귀찮게 안붙여줘도 된다.
!!!!!!!!!충격..
[연관값을 이용한, 기본은 Double인데 Dummy타입을 만든 예제]
struct Temperature<A> {
var value: Double
}
이렇게 제너릭 타입을 하나 만들어서...
struct Kelvin {}
struct Fernheit {}
struct Celcius {}
이렇게 타입을 세가지를 만들어서...
let temp_c : Temperature<Celcius> = Temperature(value: 28.9)
그럼 이렇게 쓸 수 있게 된다!!
enum Temperature {
case celcius(Double)
case fernheit(Double)
case kelvin(Double)
var celciusValue: Double {
switch self {
case let .celcius(value):
return value
case let .fernheit(value):
return (value - 32) * 5 / 9
case let .kelvin(value):
return value + 273 }
}
}
enum안에 case만 만드는게 아니라, switch self를 지정할 수도 있다...
저 예제가 너무 어려워서 다른 예제를 가지고 왔다.
enum Device {
case iPad, iPhone
var year: Int {
switch self {
case .iPhone: return 2007
case .iPad: return 2010
}
}
}
let myDevice = Device.iPad
print(myDevice.year)
참고 사이트
- 어느 갓갓님의 enum 정리...
'macOS, iOS' 카테고리의 다른 글
iOS13 모달 full screen으로 변경하기 - 스토리보드에서 (0) | 2019.10.22 |
---|---|
[iOS] Regex validation - 이메일 정규표현식 (0) | 2019.10.21 |
struct, class instance 두개를 ==(등호)로 비교하고 싶다면? (0) | 2019.10.17 |
[Swift] 배열도 도는데 index도 찾고싶으면? : enumerated (0) | 2019.10.17 |
[iOS] collection view 스크롤 가능하게 하기 (0) | 2019.10.17 |