개발하는 뚝딱이

[swift] 데이터 타입 본문

swift

[swift] 데이터 타입

개발자뚝딱이 2020. 4. 2. 19:40

 

책 <스위프트 프로그래밍 3판 ;야곰 지음> 을 정리한 글입니다.

 


 

튜플 - Tuple

- 타입의 이름이 따로 지정되어 있지 않음

- '지정된 데이터의 묶음'

var person: (String, Int, Character) = ("뚝딱", 24, "A")

print(person.0) // 접근
person.1 = 25 // 할당


var person: (name: String, age: Int, grade: Character) = ("뚝딱", 24, "A")

print(person.0) // 인덱스로 접근
person.name = "뚝딱이들" // 이름으로 할당

 


컬렉션 - 배열, 딕셔너리, 세트, String 등이 포함

 

배열 - Array

1. 빈 배열 생성

var arr: [Int] = []
var arr: [Int] = [Int]()
var arr: [Int] = Array()
var arr: [Int] = Array<Int>()

 

2. 선언과 생성

var arr: [String] = ["a", "b", "c"]
var arr: Array<String> = ["a", "b", "c"]

 

 

딕셔너리 - Dictionary

- 참고로 순서가 없음

 

1. 빈 딕셔너리 생성

var dic: [String:Int] = [:]
var dic: [String:Int] = [String:Int]()
var dic: Dictionary<String, Int> = Dictionary<String, Int>()

2. 선언과 생성

var dic: [String:Int] = ["Jin": 100, "Min": 80, "Ki": 95]

3. 사용

print(dic["Jin"]) // 접근
dic["Jin"] = 100 // 값 수정
dic["Sue"] = 66 // 값 추가

 

세트 - Set

- 집합과 같은 역할. 순서가 없고, 중복값도 없음

- 다양한 method 사용 가능

 

1. 생성

var name: Set<String> = Set<String>()
var name: Set<String> = []

2. 선언과 생성

var name: Set<String> = ["a", "b", "c"]

3. 사용

var 짝수: Set<Int> = [2, 4, 6, 8]
let 홀수: Set<Int> = [1, 3, 5, 7]
let 자연수: Set<Int> = 짝수.union(홀수)

짝수.insert(3) // 원소 추가
짝수.remove(3) // 삭제

print(짝수.count)
print(홀수.isDisjoint(with: 짝수)) // 서로 배타적인지
print(짝수.isSubset(of: 자연수)) // 짝수가 자연수의 부분집합인지
print(자연수.isSuperset(of: 짝수)) // 자연수가 짝수의 전체집합인지

 

열거형 - Enum

- 연관된 항목들을 묶어서 표현

- 추가/수정 불가

 

1. 선언

enum Grade {
    case A
    case B
    case C
    case D
    case F
}

enum Grade { case A, B, C, D, F }

2. 생성, 사용

var myGrade: Grade = Grade.A
var yourGrade: Grade = .A
yourGrade = .B // 변경

3. 원시 값 지정

- 정수 타입이면 원시값이 0부터 1씩 증가하여 할당됨

enum WeekDays: Character {
    case mon = "월", tue = "화", wed = "수"
}

let today: WeekDays = WeekDays.tue
print(today.rawValue) // '화' 출력

let tomorrow = WeekDays(rawValue: "수") // wed

4. 연관값

enum MainDish {
    case pasta(taste: PastaTaste)
    case pizza(dough: String, topping: String)
    case rice
}

enum PastaTaste {
    case cream, tomato
}

var dinner: MainDish = MainDish.pasta(taste: PastaTaste.cream)

5-1. 항목순회

- 열거형의 이름 뒤에 콜론(:) 작성하고 CaseIterable 프로토콜 채택

- 열거형에 allCases 타입프로퍼티를 통해 모든 케이스의 컬렉션 생성

- 연관값을 같는 경우 allCases 프로퍼티 직접 구현해야 함

enum Grade: CaseIterable {
    case A
    case B
    case C
    case D
    case F
}

enum WeekDays: Character, CaseIterable {
    case mon = "월", tue = "화", wed = "수"
}

let allCases: [Grade] = Grade.allCases
print(allCases) // [Grade.A, Grade.B, Grade.C, Grade.D, Grade.F]

5-2. 순환 열거형

- enum 항목의 연관 값이 자신의 값이고자 할 때 사용

- enum 키워드 앞에 indirect 붙이거나, case 키워드 앞에 indirect 붙여서 사용

indirect enum ArithmeticExpression {
    case number(Int)
    case addition(ArithmeticExpression, ArithmeticExpression)
    case multiplication(ArithmeticExpression, ArithmeticExpression)
}

let five = ArithmeticExpression.number(5)
let four = ArithmeticExpression.number(4)
let sum = ArithmeticExpression.addition(five, four)
let final = ArithmeticExpression.multiplication(sum, ArithmeticExpression.number(2))

func evaluate(_ expression: ArithmeticExpression) -> Int {
    switch expression {
    case .number(let value):
        return value
    case .addition(let left, let right):
        return evaluate(left) + evaluate(right)
    case .multiplication(let left, let right):
        return evaluate(left) * evaluate(right)
    }
}

let result: Int = evaluate(final)
print("(5 + 4) * 2 = \(result)")

'swift' 카테고리의 다른 글

[swift] 옵셔널  (0) 2020.04.28
[swift] 메소드 (method)  (0) 2020.04.27
[swift] 프로퍼티(property)  (0) 2020.04.15
[swift] 구조체(struct)와 클래스(class) 비교  (0) 2020.04.08
[swift] 연산자  (0) 2020.04.06