안녕하세요 후르륵짭짭 입니다
이번에는 Enum과 Generics에 대해서 기초적인 것을 알아보고
이 둘을 각각 사용하는 방법과
둘을 함께 사용하는 방법을 알려드리도록 하겠습니다
** Enum이란? 그리고 기본적 사용방법 **
Enum은 열거형이라고 합니다. 영어로 enumerations 라고 하죠
그래서 enum으로 불리는 겁니다.
"An enumeration defines a common type for a group of related values and enables you to work with those values in a type-safe way within your code"
즉, 관련된어 있는 그룹으로 묶는 것이라고 정의 되어 있어요.
enum Company{
case Apple
case Samsung
case Google
case Naver
}
var koreaCompany = Company.Apple
koreaCompany
//결과 : Apple
위와 같이 enum을 생성해줍니다. 그리고 (열거형_이름.케이스) 이렇게 하면 하나의 케이스를 가진 스토어프로퍼티가 생깁니다.
func changeEnumeration(_ element : inout Company){
switch element {
case .Apple:
element = .Samsung
case .Samsung:
element = .Apple
case .Google:
element = .Naver
case .Naver:
element = .Google
}
}
changeEnumeration(&koreaCompany)
koreaCompany
//결과 Samsung
이렇게 Switch 문을 통해서 어떤 열거 아이템인지 확인 할 수 있습니다.
(참고로 : inout으로 하면 주소 값에 접근해서 element의 값이 바뀌게 됩니다.)
** Enum 반복문 사용 **
enum Developer : CaseIterable{
case WEB, IOS, BIGDATA, ANDROID
}
let allCaseOFEnum = Developer.allCases.count
allCaseOFEnum
for singleCase in Developer.allCases{
print(singleCase)
}
이건 중요한건 아닌데요. case를 매번 생성 할 필요 없이
위에 처럼 한줄로 쭉~ 쓸 수 도 있습니다.
그리고 내용물을 확인 할 때는 CaseIterable이라는 프로토콜을 준수 받아야합니다.
그럼 위에 처럼 반복문 형태로 사용 할 수 있는데,,,, 쓸일이 있을지는 모르겠네요 ㅎㅎㅎ
** Enum에 값 할당 하기 **
enum Language{
case Programming(String)
case Life(String)
}
var language = Language.Programming("IOS")
switch language {
case .Programming(let word):
word
case .Life(let word):
word
}
이 코드를 보면 case Programming(String) 이렇게 되어 있습니다.
이것은 값을 할당 해주는 것이라 생각하면 편합니다.
즉, Enum.Programming = "IOS" 이렇게 생각하시면 편해요!
그러면 word 부분에 IOS에 할당 되어 있어서 결과 값이 나오게 됩니다,
** RawValue 그리고 함수 **
enum Friend : String{
case Steven = "IOS Developer"
case Ruel = "Singer"
case Hachimula = "BasketBall Player"
func BestFriend(){
switch self {
case .Steven:
print("Steven IS Best Friend")
default:
print("That NONO")
}
}
}
let myFriend = Friend.Hachimula
myFriend.rawValue
myFriend.BestFriend()
이것은 case 부분에 값을 할당 해주는 겁니다.
그런데 이때 String을 상속 받고 있죠. 저런게 필요합니다.
캐릭터면 Character , 정수면 Int,,, 이렇게요
(만약에 할당 안해주면 RawValue 값으로 case 이름이 나옵니다)
그리고 Enum 안에는 Enum 함수를 넣어 줄 수 있씁니다.
** Generic이란 **
제너릭이란, 중복을 방지해주기 위해서 만들어진 놈이라 생각하시면 편합니다!
만약에 두개의 변수를 더해주는 거라 생각해 봅시다.
func plusInt (_ a : Int, _ b : Int) -> Int {
return a + b
}
func plusString (_ a : String, _ b : String) -> String {
return a + b
}
사실 구조는 완전 똑같은데,,, 새롭게 만들어줘야 합니다. 아주 쉣입니다 ㅎㅎㅎ
코딩의 핵심은 중복을 줄이는 거죠
따라서 제너릭이라는 친구가 생긴 겁니다.
만약에 두개의 변수를 Swap 해주는 함수를 예를 들어 설명하겠습니다.
func SwapTwoElement<Gerneric>(_ one : inout Gerneric , _ two : inout Gerneric ){
let temp = one
one = two
two = temp
}
이 함수를 보면 <T> (_ one : T , _ two : T) 이렇게 되어 있습니다. (여기서 inout은 일부러 뺐습니다.)
T는 C 언어에서 템플릿을 의미하고 Swift에서는 제너릭을 의미합니다.
따라서 T는 어떤 클래스나 프로토콜이 올 수 있다 는 것을 의미합니다.
그리고 T의 이름은 HururuekChapChap 이던지, 여러가지가 될 수 있습니다.
이렇게 위에 처럼 하면 Int, String에 상관 없이 어떤 타입이든 들어 올 수 있습니다.
** Enum과 제너릭 **
enum Error<Success, Failure> {
case success(Success)
case connectionError(Failure)
func printStatus(){
switch self {
case .success(let message):
print(message)
case .connectionError(let message):
print(message)
}
}
}
func setNetwork(_ choice : Bool) -> Error<String,String>{
if choice {
return .success("통신 성공")
}
else{
return .connectionError("연결 오류")
}
}
setNetwork(false).printStatus()
이제 지금까지 배운 것을 모두 활용해보면 됩니다.
Enum에 제너릭을 선언해줍니다. <Success, failure> 이것은 두개의 타입이 들어 올 수 있음을 알려주는 겁니다.
그리고 success 케이스에는 Success 제너릭이 들어가고 connectionError 케이스에는 Failure 제너릭이 들어갑니다.
그리고 printStatus() 함수에서 값을 나타내줍니다.
이렇게 하면 Enum 과 제너릭을 같이 해서 만든 겁니다.
어렵지 않죠? 비슷한 것으로 Result<> 가 있죠 ㅎㅎㅎㅎ
지금가지 Enum 과 Generics 에 대해서 알아 봤습니다!!
모두모두 즐코코코 하세욧!!
docs.swift.org/swift-book/LanguageGuide/Generics.html
'Xcode > Swift - PlayGround' 카테고리의 다른 글
PlayGround) FireBase 알아가기 1부 (설치&읽기&저장) (0) | 2020.08.05 |
---|---|
PlayGround) Closure 에 대해서 알아보자 3부 (Escaping) (0) | 2020.08.04 |
PlayGround) Struct 와 Class의 차이 그리고 Protocol (1) | 2020.07.23 |
PlayGround) SQLite를 이용하여 데이터를 저장하자! (0) | 2020.07.18 |
PlayGround) Closure에 대해서 알아보자 2부 (nonEscaping) (0) | 2020.07.17 |
댓글