Swift Collection
-
Collection : 데이터의 모임 (수집, 모음집)
Swift Collection 종류
-
Array(배열): 일련번호를 구분하는 데이터의 연속적인 모임.
-
Set: 데이터를 중복없이 해싱을 이용(데이터의 순서를 알수없음)해서저장하는 데이터모임
-
Tuple: 데이터를 연속적으로 모아놓는데, 추가하거나 수정하거나 삭제할 수 없는 구조. array와 다르게 이름을 붙일 수 있음.
-
Dictionary: 번호대신에 이름을 붙여서 데이터를 저장하는 구조 - Key:Value 구조
-
String: Character의 집합
⇒ tuple을 제외하고는 모두 동일한 자료형의 데이터만 저장이 가능한데, Any와 AnyObject를 이용하면 모든 자료형의 데이터를 저장할 수 있음.
-
Any와 AnyObject는 array나 set에는 이용하지 않음. array와 set은 저장하고 있는 데이터를 비교할 수 있어야하기때문. 데이터를 비교하려면 모든 데이터들의 자료형이 동일해야 함.
-2차원 구조에서 행방향이 tuple, dict (이름, 성별, 나이, 직업)
-열방향이 array, set (같은 데이터(이름, 성별등). 비교할 수 있음)
2. 배열(array) - 스위프트에서는 Array, Objective-C에서는 NSArray, NSMutableArray
-> Objective-C 자료형의 데이터는 대응되는 Swift의 자료형으로 형변환해서 사용이 가능.
-
생성방법:
데이터를 가지고 만드는 경우
-var 또는 let 배열이름 = [값을 나열]
-var 또는 let 배열이름 : [자료형] = [값을 나열]
비어있는 상태로 만드는 경우
-var 또는 let 배열이름 = [자료형]()
-var data = [String]()
배열 + 배열 가능
2) 배열의 데이터 개수는 count속성 호출
3) 항목 접근은 [인덱스]를 사용
4) 배열의 일부분 가져오기[시작인덱스...마지막인덱스]
5) 전체 데이터 접근 for-in 을 사용해도 되고 count를 이용해서 while을 이용해도 됨.
6) 데이터 추가나 중간에 삽입은 append와 insert메소드 이용
7) 배열에 배열을 추가하는 것은 append메소드와 += 연산
8) 삭제는 remove(인덱스) 또는 removeLast()
9) sort를 이용해서 정렬가능
//비어있는 배열 생성 (정수배열)
var ar = [Int]()
ar.append(100)
ar.insert(30, at: 0)
ar.insert(87, at: 1)
//전체 출력
print(ar)
//모든 데이터를 순서대로 접근할때는 for...in 사용.
for imsi in ar{
print(imsi)
}
3. 배열의 함수적 프로그래밍 : Map-Reduce기법이 함수적 프로그래밍 방식으로 작업
-> 함수를 매개변수로 받아서 처리하는 프로그래밍 방식
-
map
=> 데이터 목록과 함수를 받아서 데이터 목록 각각에 함수를 수행한 뒤, 그 리턴값으로 새로운 데이터를 만들어 주는 함수.
-> 여기에 대입되는 함수는 하나의 매개변수를 갖고, 하나의 리턴값을 가져야 함.
2) filter
-> 데이터 목록과 함수를 받아서 데이터 목록 각각에 함수를 수행한 뒤 True를 리턴한 데이터만
골라서 새로운 데이터를 만들어 주는 함수
-> 여기에 대입되는 함수는 하나의 매개변수를 갖고, Bool로 리턴해야 함.
3) reduce
-> 데이터 목록과 함수를 받아서 데이터 목록 각각에 함수를 수행한 뒤 하나의 결과를 리턴하는
메소드
-> 여기에 대입되는 함수는 2개의 매개변수를 갖고 하나의 데이터를 리턴해야 함.
-> 2개의 매개변수는 하나는 누적이고 다른 하나는 데이터 목록 각각의 데이터
4) 데이터 목록에서 작업을 할 때 map이나 filter또는 reduce로 해결이 가능하다면, 이 함수들을
이용하는 것이 효율적임.
var ar = [Int]()
ar = [100, 300, 279, 165, 208]
// map에 대입할 함수 : 하나의 매개변수를 받아서 하나의 데이터를 리턴하는 구조
func inc(p: Int) -> Int {
return p+1
}
let result = ar.map(inc)
print(result)
//홀수만 골라내는 필터링
//filter의 매개변수는 하나의 매개변수를 받아서 Bool을 리턴하는 함수
result = ar.filter({(v:Int) -> Bool in
return v % 2 == 1
})
print(result)
3. Set - NSMutableSet(수정가능), NSSet(수정 불가능)
-
데이터를 중복없이 Hashing을 이용해서 저장
-
검색속도가 가장 빠름
1)생성
데이터 있는 경우
var 또는 let 변수명 = Set([데이터 나열])
데이터 없는 경우
var 또는 let S변수명 = Set<하나의자료형>()
2) 데이터 개수는 count속성
3) 모든 데이터 순회는 for - in 으로만 가능.
4) first나 last속성이 있음.
5) iOS프레임워크가 터치 이벤트와 위치 정보를 가져오는 메소드에서 데이터를 set으로 제공.
var actors = Set<String>()
actors.insert("데이터1")
actors.insert("데이터2")
actors.insert("데이터3")
//모든 데이터 접근
for actor in actors {
print(actor)
}
print(actors.first) //첫번째 데이터 접근, 뭐가 먼저 나오는지는 랜덤
//Optional을 해제
//Set이나 Dict등에서 데이터를 가져오는 경우는
//대부분 Optional임.
print(actors.first!) //첫번째 데이터 접근
if let actress = actors.first {
print(actress)
}
6) 집합 연산 메소드를 소유
-
intersection: 교집합으로 공통된 데이터만 추출
-
symmetricDifference: 한쪽에만 존재하는 데이터들을 모아서 새로운 set생성
-
union: 합집합
-
subtract: 호출하는 쪽에만 존재하는 데이터만 - 차집합
-
isSubset(of:): 부분집합 여부
-
isSuperset(of:): 부모집합 여부
4. Tuple
-
여러가지 종류의 데이터를 묶어서 저장할 수 있는 자료형.
-
한 번 만들어지면 개수를 늘리거나 삭제하거나 수정은 안됨.
-
생성
var 또는 let 변수명 = (값을 나열)
var 또는 let 변수명(자료형 나열) = (값을 나열)
var 또는 let 변수명(자료형 나열) = (이름:값, 이름:값) 의 형태로 생성도 가능.
2) 접근 방법
case 1:
-
이름없이 만든 경우는 인덱스를 이용해서 각각의 데이터를 접근
-
튜플.0, 튜플.1 형식으로 접근
case 2:
-
이름을 만든 경우에는 이름을 이용해서 접근이 가능
-
튜플.이름의 형식으로 접근 가능.
3) 분할해서 대입 가능
var(변수명 나열) = 튜플
-> 튜플의 각 요소를 변수에 나열해서 대입.
4) 튜플의 활용
-> DTO클래스 (여러개의 데이터를 묶어서 하나의 행을 만들어주는 클래스, VO라고도 함.) 대용으로 사용할 수 있음.
-> 파이썬 같은 언어에서는 데이터 분석 결과를 만들어 줄 때 튜플을 활용.
중요:
-
튜플과 배열을 이용한 데이터 테이블 구조를 생성
-
DTO 클래스의 형식과 유사한 Tuple 자료형 생성
-
번호, 이름, 전화번호를 저장하는 Tuple 자료형 생성
-
num, name, mobile을 저장할 수 있는 튜플을 Phonebook이라는 별명으로 사용할 수 있도록 생성.
typealias PhoneBook = (num:Int, name:String, mobile:String)
// 데이터 모임 만들기. PhoneBook의 리스트가 된 것임.
var phoneBookList = [PhoneBook]()
// 데이터 추가
phoneBookList.append((num:1, name: "조헌", mobile:"010-xxx-xxxx"))
phoneBookList.append((num:2, name: "최영", mobile:"011-xxx-xxxx"))
phoneBookList.append((num:3, name: "최혁", mobile:"019-xxx-xxxx"))
//전체데이터확인
//print(phoneBookList) 보다는 아래와 같이 for..in 구문으로 순회해서 사용.
for data in phoneBookList{
print(data.num, data.name)
}
5. Dictionary - Map 이나 HashTable로 부르기도 하는데 Objective-C에서는 NSDictionary, NSMutableDictionary. 대괄호 사용.
-
데이터를 key-value 쌍으로 저장하는 자료구조
-
생성
var 또는 let 변수명 = [키의 자료형: 값의 자료형]()
직접데이터를 주어서 생성시:
var 또는 let 변수명 = [키:값, 키:값…]
2) 데이터 개수는 count속성
3) 데이터 추가 및 갱신
-
변수명[키] = 값
-
존재하는 키이면 갱신이 되고, 존재하지 않는 키면 삽입이 됨.
4) 데이터 가져오기
-
변수명[키]
-
존재하지 않는 키가 있을 수 있으므로 리턴타입은 옵셔널임. (옵셔널 해제 필요).
5) 삭제
-
변수명[키] = nil
-
removeValueForKey(키)
6) for - in 을 이용해서 순차적으로 접근하면 key와 value를 튜플로 묶어서 반환.
7) keys속성을 이용하면 모든 key들을 가져올 수 있음.
// dictionary 1개 생성
var dict = [String: String]()
// 데이터 추가
dict["name"] = "안중근"
dict["hometown"] = "충남홍성"
// 데이터 갱신
dict["hometown"] = "충남 홍성"
// 전체 데이터 확인
print(dict)
// Dictionary는 내부 구성요소를 전부 알지 못해도 순회 가능.
//iOS프레임워크에서 메소드의 수행 결과를 dictionary로 제공하는 경우가 많음.
// dictionary가 오면 도움말을 보지 않고도 확인이 가능.
for key in dict.keys{
print(key, ":", dict[key]!)
}
결과값은 아래와 같이 출력
hometown : 충남 홍성
name : 안중근
9) 딕셔너리의 value type으로 Any를 사용하는 경우가 있음.
-
여러 종류의 데이터를 하나의 딕셔너리에 저장하기 위함.
-
스위프트 문법 교재들에서는 Any를 사용하지 않고 특정 자료형으로 고정해서 사용.
-
애플의 API들은 Dictionary를 만들 때 거의 대부분 Value Type으로 Any를 사용함.
-
애플에서는 특별한 경우가 아니면 2차원 배열을 만들지 않는 것을 권장. 2차원 배열은 행렬을 만들 때를 제외하고는 그다지 효율적이지를 못함.
// 프로야구 각 팀 선수 명단을 저장
// 팀별로 배열을 생성
// 아래 방식은 선수를 추가하면 되지만, 팀을 추가 할 경우 오류가 남.
var kia = ["안치홍", "김주찬", "최형우"]
var dusan = ["권혁", "린드블럼", "김재환"]
var lg = ["오지환", "임찬규"]
// 각 팀의 배열을 가지고 배열을 생성.
var baseBall = [kia, dusan, lg]
// 위의 데이터를 팀 이름을 출력하고 선수명단을 출력.
for x in 0..<baseBall.count{
if x == 0 {
print("기아")
} else {
print("두산")
}
let imsi = baseBall[x]
for temp in imsi{
print(" \(temp)")
}
}
딕셔너리 활용을 통한 팀이름 선수 호출 방법.
var kia = ["안치홍", "김주찬", "최형우"]
var dusan = ["권혁", "린드블럼", "김재환"]
var lg = ["오지환", "임찬규"]
// Dictionary를 생성해서 배열에 저장
var dict1 = [String:Any]()
dict1["team"] = "기아"
dict1["data"] = kia
var dict2 = [String:Any]()
dict2["team"] = "두산"
dict2["data"] = dusan
var dict3 = [String:Any]()
dict3["team"] = "엘지"
dict3["data"] = lg
// 각 팀의 배열을 가지고 배열을 생성.
var baseBall = [dict1, dict2, dict3]
for dict in baseBall{
//any는 원래의 자료형으로 형변환해서 사용.
let team = dict["team"] as! String
print(team)
//Any를 swift자료형으로 형 변환했는데 에러가 나면
//앞에 NS를 붙여서 Objective-C자료형으로 변환한 후
//swift자료형으로 변환하면 됨.
let data = (dict["data"] as! NSArray) as Array
for temp in data{
print(" \(temp)")
}
}
이 경우는 새로운 팀을 추가해도, 출력부분을 수정하지 않아도 잘 됨.
var kia = ["안치홍", "김주찬", "최형우"]
var dusan = ["권혁", "린드블럼", "김재환"]
var lg = ["오지환", "임찬규"]
var samsung = ["오승환", "김재규"]
// Dictionary를 생성해서 배열에 저장
var dict1 = [String:Any]()
dict1["team"] = "기아"
dict1["data"] = kia
var dict2 = [String:Any]()
dict2["team"] = "두산"
dict2["data"] = dusan
var dict3 = [String:Any]()
dict3["team"] = "엘지"
dict3["data"] = lg
var dict4 = [String:Any]()
dict4["team"] = "삼성"
dict4["data"] = samsung
var baseBall = [dict1, dict2, dict3, dict4]
for dict in baseBall{
//any는 원래의 자료형으로 형변환해서 사용.
let team = dict["team"] as! String
print(team)
//Any를 swift자료형으로 형 변환했는데 에러가 나면
//앞에 NS를 붙여서 Objective-C자료형으로 변환한 후
//swift자료형으로 변환하면 됨.
let data = (dict["data"] as! NSArray) as Array
for temp in data{
print(" \(temp)")
}
}
'Swift' 카테고리의 다른 글
Swift - Optional(옵셔널) (0) | 2020.03.20 |
---|---|
Swift - First Class Citizen (0) | 2020.03.19 |
Swift - Closure(클로저) (0) | 2020.03.19 |
Swift - Function(함수) (2) | 2020.03.19 |
Swift - 변수와 상수(Constant and Variables in Swift) (0) | 2020.03.16 |