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 | 31 |
Tags
- UITextView
- Clean Code
- uitableview
- Human interface guide
- rxswift
- ios
- swift documentation
- SWIFT
- clean architecture
- Refactoring
- 애니메이션
- tableView
- MVVM
- collectionview
- ribs
- map
- 리펙터링
- 스위프트
- UICollectionView
- uiscrollview
- combine
- 리펙토링
- 클린 코드
- HIG
- Xcode
- RxCocoa
- 리팩토링
- Observable
- Protocol
- swiftUI
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