티스토리 뷰
안녕하세요 :) Zedd입니다.ㅇ
요새 리팩토링을 엄청 열심히 하고 있는데....UIColor관리를 어떻게 해야할까 찾아보다가 엄청나게 재밌는글을 발견했습니다.
Natasha The Robot - Swift: The 😎 Case of An Enum With No Cases
그 전에 namespace라는 개념을 알고계시면 좋은데요.
그냥 간단하게 말해서 그냥 관련있는 것들끼리 모아놓은 공간?이라고 생각하시면 편합니다.
그래서 Swift에서도 이 namespace를 어떻게 만들고 그럴거냐..에 대한 건데요.
struct ColorPalette {
static let Red = UIColor(red: 1.0, green: 0.1491, blue: 0.0, alpha: 1.0)
static let Green = UIColor(red: 0.0, green: 0.5628, blue: 0.3188, alpha: 1.0)
static let Blue = UIColor(red: 0.0, green: 0.3285, blue: 0.5749, alpha: 1.0)
struct Gray {
static let Light = UIColor(white: 0.8374, alpha: 1.0)
static let Medium = UIColor(white: 0.4756, alpha: 1.0)
static let Dark = UIColor(white: 0.2605, alpha: 1.0)
}
}
자.. ColorPalette라는 구조체를 만들어주었고, 그 안에 타입프로퍼티를 만들어주었습니다. 또! 중첩타입을 사용해서 ColorPalette구조체 안에 Gray라는 구조체를 또 만들어주었네요.
사용은
let red = ColorPalette.Red
let darkGray = ColorPalette.Gray.Dark
이런식으로 할 수 있습니다. 엥 ColorPalette().Red가 아니라? ==> Red는 타입 프로퍼티니까요 :)
아무튼 이런식으로 UIColor만을 모아놓은 namespace를 하나 정의했다고 볼 수 있겠네요.
혼자 개발하면 좋겠지만...모두 협업을 하잖아요?
다른 개발자가 이 ColorPalette라는게 UIColor의 타입프로퍼티들을 모아놓은 namespace라는 것을 모르고
let myColorPallete = ColorPalette()
ColorPalette의 인스턴스를 만들어버립니다. 이걸만들어서 되는게 있나요? 아뇨 없죠. 우리는 이런상황을 바라지 않습니다. 그럼 어떻게 해야할까요?
2가지 방법이 있습니다.
1. init을 못하게하자!
struct ColorPalette {
private init() {}
static let Red = UIColor(red: 1.0, green: 0.1491, blue: 0.0, alpha: 1.0)
static let Green = UIColor(red: 0.0, green: 0.5628, blue: 0.3188, alpha: 1.0)
static let Blue = UIColor(red: 0.0, green: 0.3285, blue: 0.5749, alpha: 1.0)
.
.
.
}
이렇게 init을 private로 만들어버리면,
이렇게, 인스턴스화 하려고 하면 에러가 납니다.
두번째 방법이 있습니다.
2. case가 없는 enum을 만들자.
ㅇ? enum하면 case아닌가요?
case가 없는 enum이 가능;?
네! 가능합니다.
enum ColorPalette {
static let Red = UIColor(red: 1.0, green: 0.1491, blue: 0.0, alpha: 1.0)
static let Green = UIColor(red: 0.0, green: 0.5628, blue: 0.3188, alpha: 1.0)
static let Blue = UIColor(red: 0.0, green: 0.3285, blue: 0.5749, alpha: 1.0)
enum Gray {
static let Light = UIColor(white: 0.8374, alpha: 1.0)
static let Medium = UIColor(white: 0.4756, alpha: 1.0)
static let Dark = UIColor(white: 0.2605, alpha: 1.0)
}
}
오 신기하죠? case가 없는 enum도 아주 잘 만들어집니다. enum안의 enum인 Gray도 case가 없도록 잘 만들어졌죠?
사용방법은 위에서 구조체로 만든것과 동일합니다.
let red = ColorPalette.Red
let darkGray = ColorPalette.Gray.Dark
그럼......다른 개발자가 이 enum을 인스턴스화 하려고 하면?
let myColorPallete = ColorPalette()
바로 이렇게 에러가 나버리므로, ColorPalette를 인스턴스화 할 수 없습니다. :)
간단하죠? 원하시는대로 namespace를 잘 만드셨으면 좋겠습니다.
저는 enum을 사용하려구요 XD
출처 :
Natasha The Robot - Swift: The 😎 Case of An Enum With No Cases
'iOS' 카테고리의 다른 글
iOS ) ScrollView에서 위아래 Gesture를 감지하고싶다면? / UIGestureRecognizerDelegate (1) | 2017.12.26 |
---|---|
iOS ) Gesture Recognizer - Pan (7) | 2017.12.22 |
iOS ) Archive시 No such module에러가 난다면? (0) | 2017.12.20 |
iOS ) Today Extension에서 설정한 이미지가 안보인다면? (0) | 2017.12.19 |
iOS ) Add the App Groups feature to your App ID. (0) | 2017.12.19 |
- fastlane
- Swift
- FLUTTER
- WWDC
- swift3
- 회고
- swift sort
- Accessibility
- IOS
- swift array
- swift tutorial
- np-hard
- 피아노
- 스위프트 문법
- SwiftUI
- iOS delegate
- 스위프트
- swift delegate
- np-complete
- ios 13
- UIBezierPath
- Combine
- swift 공부
- github
- WKWebView
- actor
- WidgetKit
- Git
- 제이슨 파싱
- Xcode
- Total
- Today
- Yesterday