Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- clean architecture
- SWIFT
- HIG
- UICollectionView
- Observable
- 클린 코드
- ios
- uiscrollview
- 리펙토링
- 애니메이션
- rxswift
- Protocol
- swiftUI
- tableView
- map
- Clean Code
- UITextView
- ribs
- RxCocoa
- MVVM
- 스위프트
- Human interface guide
- 리팩토링
- uitableview
- 리펙터링
- Refactoring
- swift documentation
- collectionview
- Xcode
- combine
Archives
- Today
- Total
김종권의 iOS 앱 개발 알아가기
[iOS - swift] Enum에서 초기화하는 테크닉 (~= 연산자) 본문
* Enum에 Equatable 프로토콜을 준수하여 만드는 방법) https://ios-development.tistory.com/348
Enum에 ~= 연산자 사용하여 init 만들기
- 일반적인 경우, enum은 String을 준수하여 rawValue로 초기화가 가능
enum NamePrefix: String {
case kim
case lee
case park
}
(rawValue로 초기화)
let namePrefix = NamePrefix(rawValue: "kim")
print(namePrefix) // Optional(ExEnum.NamePrefix.kim)
- ~= 연산자를 사용하면, 손쉽게 equatable 속성으로 만들기가 용이
- static으로 ~= 연산자를 정의
- failable init으로 초기화 정의 (~=연산자가 정의 되었으므로, switch문으로 값 구분이 가능)
enum NamePrefix2: String {
case kim
case lee
case park
init?(name: String) {
switch name {
case .kim:
self = .kim
case .lee:
self = .lee
case .park:
self = .park
default:
return nil
}
}
static func ~=(lhs: Self, rhs: String) -> Bool {
return lhs.rawValue == rhs
}
}
let namePrefix2 = NamePrefix2(name: "kim")
print(namePrefix2) // Optional(ExEnum.NamePrefix2.kim)
associated value가 있는 경우 처리 방법
- associated value가 존재하면 rawValue값을 사용하면 컴파일 에러가 나므로, String 준사하던 점을 걷어내기
enum NamePrefix2 {
case kim
case lee
case park(age: Int?)
}
- rawValue값을 사용하지 못하므로, ~= 연산자에서 비교할 값인 property 정의
var name: String {
switch self {
case .kim:
return "kim"
case .lee:
return "lee"
case .park(let age):
return "park"
}
}
static func ~=(lhs: Self, rhs: String) -> Bool {
return lhs.name == rhs
}
- switch 문에서 초기화
- 주의할점은 associated value 값에 사용하는 아래 문법
- case .park (age: nil)
init?(name: String) {
switch name {
case .kim:
self = .kim
case .lee:
self = .lee
case .park(age: nil):
self = .park(age: Int.random(in: 1...10))
default:
return nil
}
}
- 전체 코드
enum NamePrefix2 {
case kim
case lee
case park(age: Int?)
var name: String {
switch self {
case .kim:
return "kim"
case .lee:
return "lee"
case .park(let age):
return "park"
}
}
init?(name: String) {
switch name {
case .kim:
self = .kim
case .lee:
self = .lee
case .park(age: nil):
self = .park(age: Int.random(in: 1...10))
default:
return nil
}
}
static func ~=(lhs: Self, rhs: String) -> Bool {
return lhs.name == rhs
}
}
- 사용하는 쪽
let namePrefix2 = NamePrefix2(name: "park")
* 참고
'iOS 응용 (swift)' 카테고리의 다른 글
Comments