- 스위프트의 데이터 타입이든, 임의로 만든 데이터 타입이든 이미 존재하는 데이터 타입에 임의로 별칭을 부여. 기존에 사용하던 데이터 타입의 이름과 프로그래머가 만든 별칭 모두 사용 가능
typealias myInt = Int
var age : myInt = 99
typealias myDouble = Double
var height : myDouble = 187.9
- 튜플은 타입의 이름이 따로 지정되어 있지 않은, 프로그래머 마음대로 만드는 타입이다.
'지정된 데이터의 묶음' 이라고 표현 할 수 있다.
튜플은 타입 이름이 따로 없으므로 일정 타입의 나열만으로 튜플 타입을 생성할 수 있다
var person: (String, Int, Double) = ("dinx", 75, 187.9)
print("이름 = \(person.0), 몸무게 = \(person.1), 신장 = \(person.2)")
==> "이름 = dinx, 몸무게 = 75, 신장 = 187.9"
person.0 = "철수"
person.1 = 71
person.2 = 175.2
print("이름은 \(person.0), 몸무게는 \(person.1)kg, 신장은 \(person.2)cm 입니다")
==> "이름은 철수, 몸무게는 71kg, 신장은 175.2cm 입니다"
//person을 변수로 선언했으므로 변경 가능
- 튜플의 요소마다 이름을 붙힐 수도 있다.
var person2: (name:String, weight:Int, height:Double) = ("영민",65,165.2)
print("이름:\(person2.name), 몸무게:\(person2.weight), 신장:\(person2.height)")
==> "이름:영민, 몸무게:65, 신장:165.2"
- 튜플에 별칭을 지정할 수도 있다.
typealias personTuple = (name: String, weight:Int, height:Double)
let chulsu : personTuple = ("철수" , 75 , 170.2)
let mangu : personTuple = ("맹구" , 80 , 190.4)
print("이름:\(chulsu.name), 몸무게:\(chulsu.weight), 신장:\(chuls.height)")
==> "이름:철수, 몸무게:75, 신장:170.2"
//personTuple 이라는 튜플을 하나의 별칭 타입으로 지정하여 사용한 것.
- 튜플 외에도 많은 수의 데이터를 묶어서 저장하고 관리할 수 있는 컬렉션 타입이 있다.
배열(Array), 딕셔너리(Dictionary), 세트(Set) 등이 있다.
- 배열은 같은 타입의 데이터를 '일렬로 나열' 한 후 순서대로 저장하는 형태의 컬렉션 타입이다.
// 배열 선언하기
var name:[String] = ["철수","맹구","훈
이","짱구"]
var name:Array<String> = ["철수", "맹구", "훈이","짱구"]
print(name[2])
==> 맹구
// 배열에서 2번째 순서의 값을 출력함
name.append("유리") // 배열에 마지막 순서에 값을 추가.append 메서드
name.append(contenOf: ["나미리","채송화"] // 배열에 값 추가.append(contentOf:)
name.insert("수지", at: 2) // 2번째 순서에 값(수지)를 추가.insert(값,at:순서)
- 딕셔너리는 요소들이 순서 없이 키와 값의 쌍으로 구성되는 컬렉션 타입이다.
딕셔너리에 저장되는 값은 항상 키와 쌍을 이루게 되는데, 딕셔너리 안에는 키가 하나이거나 여러개 일 수 있다. 단, 하나의 딕셔너리 안의 키는 같은 이름을 중복해서 사용할 수 없다.
typealias StringIntDictionary = [String:Int] // typealias 를 이용하여 단순하게 표현
var numberForName: Dictionary<String, Int> = Dictionary<String,Int>() // 키는 String, 값은 Int 인 Dictionary를 생성합니다.
var numberForName0: [String:Int] = [String:Int]() // 위와 같은 표현임
var numberForName1: StringIntDictionary = StringIntDictionary() // 위와 같은 표현임
var numberForName2: [String:Int] = ["민수":100, "영희":200, "철수":300, "짱구":250]
print(numberForName2["민수"] as Any)
- 세트는 같은타입의 데이터를 순서 없이 하나의 묶음으로 저장하는 형태의 컬렉션 타입이다. 세트 내의 값은 모두 유일한 값이며, 즉 중복된 값이 존재하지 않는다. 다음의 경우 세트를 이용한다.
- 순서가 중요하지 않을 때
- 각 요소가 유일한 값이어야 하는 경우
let jungleChampion : Set<String> = ["Xinchao","Werick","Olaf","Garen"]
let topChampion : Set<String> = ["Singed","Olaf","Garen","Camile"]
let interSection : Set<String> = jungleChampion.intersection(topChampion)
print(interSection)
==> ["Olaf", "Garen"]
// 교집합
let symmetricDiffSet: Set<String> = jungleChampion.symmetricDifference(topChampion)
print(symmetricDiffSet)
==> ["Werick", "Xinchao", "Singed", "Camile"]
// 여집합의 합
let unionSet: Set<String> = jungleChampion.union(topChampion)
print(unionSet)
==> ["Werick", "Xinchao", "Singed", "Camile", "Olaf", "Garen"]
// 합집합
let subtractSet: Set<String> = jungleChampion.subtracting(topChampion)
print(subtractSet)
==> ["Werick", "Xinchao"]
// 차집합
// 포함관계 연산
var 미드챔피언 : Set<String> = ["아지르","판테온","피즈","브랜드","제라스"]
var 서폿챔피언 : Set<String> = ["바드","알리스타","브랜드","제라스","판테온"]
var 챔피언 : Set<String> = 미드챔피언.union(서폿챔피언) // 미드챔피언과 서폿챔피언을 챔피언에 포함시킨다.
print(챔피언)
==> ["알리스타", "피즈", "브랜드", "제라스", "판테온", "바드", "아지르"]
- 열거형은 연관된 항목들을 묶어서 표현할 수 있는 타입이다.
Swift에서의 열거형은 강력한 기능을 가지고 있기 때문에 잘 알아야 한다.
열거형은 배열이나 딕셔너리 같은 타입과 다르게 사용자가 정의한 항목 값 외에는 추가/수정이 불가능하다. 그렇기 때문에 딱 정해진 값만 열거형 값에 속할 수 있다.
다음과 같은 경우 열거형을 사용한다.
- 제한된 선택지를 주고 싶을 때
- 정해진 값 외에는 입력받고 싶지 않을 때
- 예상된 입력 값이 한정되어 있을 때
enum 원딜 {
case 케이틀린
case 바루스
case 트리스타나
case 베인
case 진
}
enum 원딜2 {
case 트위치 , 코그모 , 자야 , 카이사
}
var 일티어원딜: 원딜 = 원딜.진
var 이티어원딜: 원딜2 = .자야
// 열거형의 원시 값 지정과 사용 (.rawValue)
enum 정글러 : String {
case 초식정글 = "아무무"
case 육식정글 = "우디르"
case 성장형정글 = "쉬바나"
case 갱킹형정글 = "리신"
case 예능정글 = "티모"
}
let 정글러종류: 정글러 = 정글러.육식정글
print("제가 잘하는 정글은 \(정글러종류) 입니다.") // rawValue인 "우디르"가 아니라 육식정글로 출력
print("저의 모스트 정글챔피언은 \(정글러종류.rawValue) 입니다.") // 지정해준 rawValue인 "우디르"로 출력
오늘은 어제 기본 데이터 타입보다 살짝 어려운 심화 데이터 타입을 배웠습니다. 확실히 어제보다 살짝 난이도가 있는 것 같은 느낌이 들었습니다. 최대한 이해하기 쉽게 예제에 나와있는 변수나 값들을 제가 좋아하는 게임인 리그오브레전드를 대입하여 바꾸어 보았습니다.
공부는 현재 야곰님의 Swift프로그래밍3판을 통해 진행중입니다. :)
iOS 앱 개발자가 되는 그 날까지 화이팅!!