본문 바로가기

Language/Swift

3. Tuple, Collections, Enum

typealias: 사용자 마음대로 타입 선언을 하는 기능

typealias: CustomInt = Int
typealias: CustomString = String

let name: CustomString = "test"
let age: CustomInt = 20

// 처음 선언한 타입과 캐스팅 가능
let age2: Int = 30
age2 = age

 

Tuple: 사용자가 임의로 만드는 타입 (c언어의 구조체와 비슷)

// Index를 통해서 접근 및 수정 가능
var person: (String,Int) = ("name", 20)
person.0 = "change name"
person.1 = 10

// Index에 Alias 사용 가능
var computer: (cpu: String, memory: Int) = ("Intel", 16)
computer.cpu = "AMD"
computer.memory = 32

// Type Alias 사용 가능
typealias Phone = (name: String, color: String, price: Int)
let iPhone: Phone = ("XS", "White", 100)
let galaxy: Phone = ("20", "Gray", 100)

 

Collections

1. Array: 자바의 List 와 유사

// 두가지 선언방식이 같은 표현이다.
var fruites: Array<String> = ["apple", "lemon", "grape", "melon"]
var fruites: [String] = ["apple", "lemon", "grape", "melon"]

// 배열 요소 관련 메소드
fruites.isEmpty // java code => fruites.isEmpty()
fruites.count // java code => fruites.size()
fruites.append("banana") // java code => fruites.push("banana")

2. Dictionary: 자바의 Map과 유사

// 아래 구문은 모두 같은 동작을 하는 코드 
var map: Dictionary<String, String> = Dictionary<String, String>()
var map: [String, String] = [String, String]()
typealias CustomMap = [String, String]
var map: CustomMap = CustomMap()

map["key"] = "value" // java code => map.put("key", "value")

3. Set: 자바의 Set과 유사

// 아래 두개의 코드는 같은 동작을 한다.
var nations: Set<String> = Set<String>()
var nations: Set<String> = []
nations = ["Korea", "Japan", "China", "USA"]
nations.insert("Canada")
nations.remove("China")

Set 객체 끼리는 집합 연산 (교집합, 합집합, 여집합, 차집합) 이 가능하다.

또한 포함관계 연산(전체집합 - isSuperset, 부분집합 - isSubSet 여부)도 가능

그밖에, Set 요소들의 순서를 섞는 메소드 (원본은 안섞을 수도있고 - shuffled(), 원본 자체를 섞을수도 있음 - shuffle()) 가 있음

// 교집합
aSet.insertsection(bSet)
// 합집합
aSet.union(bSet)
// 여집합
aSet.symmetricDifference(bSet)
// 차집합
aSet.subtracting(bSet)

 

Enum: 자바의 enum과 유사 그러나 java가 제공하는 enum에 비해 많은 기능이 더 있음

// 아래 두개는 같은 동작을 하는 코드
enum Reward {
    case money
    case point
    case item
}

enum Reward {
	case money, point, item
}

// java version
enum Reward {
	money,
    point
}

// Reward type 변수 선언
var changeableReward: Reward = Reward.point
changeableReward = .item

// enum type에 값을 대입시킬 수 있음
enum Reward: String {
	case money = "돈"
    case point = "포인트"
    case item = "아이템"
}

let immutableReward = Reward.money
print(\(immutableReward.rawValue))

// java version
enum Reward {
	money("돈"),
    point("포인트"),
    item("아이템")
    
    private String rawValue;
    
    public Reward (String rawValue) {
	    this.rawValue = rawValue;
    }
    
    public getRawValue () {
    	return this.rawValue;
    }
}

Reward item = Reward.item;
System.out.println(item.getRawValue());

Enum 연관 값: 각 type별로 추가로 type을 추가해 줄 수있다. (sample 코드 참고 설명하기 어렵다.)

// enum 요소 옆 괄호안에 있는걸 연관 값이라고 한다. 꼭 있을 필요는 없다.
// 연관값 type 자체를 enum형으로 사용해도 됨.
enum Electronics {
	case TV(inch: Int)
    case Freezer(L: Int)
    case Monitor(inch: Int, is4K: Bool)
    case Dryer
}

var tv: Electronics = Electronics.TV(75)
var monitor: Electronics = Electronics.Monitor(27, true)
var dryer: Electronics = .Dryer

그밖의 기능: Enum 항목순회 (CaseIterable 프로토콜을 사용), indirect라는 키워드로 연관값과 자신을 일치 시킬때 사용하고, 키워드의 위치는 개별 요소 적용을 하려면 case 키워드 앞, Enum전체에 사용을 하려면 enum 키워드 앞에 작성하면 된다. (아직 써보지 않아서, 많이 쓰일것 같으면 따로 블로깅 필요!!)

'Language > Swift' 카테고리의 다른 글

2. 데이터 타입 종류  (0) 2020.05.02
1. 변수 & 상수  (0) 2020.04.30