Collection : 변수를 관리하는 방법
- Array
- Dictionary
// 이 둘은 필수 개념- Set
- Closure
데이터를 순서대로 담을 수 있게 해줌
✔️ element가 모두 동일한 타입이어야함
✔️ 순서가 있음 (순번: index, 0부터 시작)
Array는 언제 사용하면 좋지?
1. 순서가 있는 아이템
2. 아이템의 순서를 알면 유용할 때
1️⃣
var evenNumbers: [Int] = [2,4,6,8]
2️⃣
let evenNumbers: Array <Int> = [2,4,6,8]
evenNumbers.append(10) //evenNumbers를 let으로 만드는 경우 오류남
1️⃣
evenNumbers += [12, 14, 16]
2️⃣
evenNumbers.append(contentsof:[18,20])
1️⃣ 비어있는지 확인하는 법
let isEmpty = evenNumbers.isEmpty // False
evenNumbers = [] //비워짐
2️⃣ element가 몇 개 있는지 확인
evenNumbers.count
3️⃣ 첫번째 요소 확인 (마지막 요소 확인)
print(evenNumbers.first)
//optional로 반환됨
//evenNumbers가 빈 어레이이면 first 값이 nil이 되기 때문에 항상 first값이 존재한다고 장담할 수 없음
print(evenNumbers.last)
-> optional binding
if let firstElement = evenNumbers.first {
print("---> first element: \(firstElement)")
}
최소값, 최댓값 확인
evenNumbers.min() evenNumbers.max() //둘 다 optional
4️⃣ element 가져오기
var firstItem = evenNumbers[0]
var secondItem = evenNumbers[1]
//index로 값 가져오면 됨
//없는 index의 element 가져오려고 하면 에러남
5️⃣ range type
let firstThree = evenNumbers
let firstThree = evenNumbers[0...2]
//0,1,2번째 index의 값 가져옴
6️⃣ 값이 array 안에 있는지 확인
evenNumbers.contain(3) //False
evenNumbers.contain(4) //True
7️⃣ 새로운 값 추가 (기존 index에)
evenNumbers.insert(0, at:0)
//기존 element들은 다 뒤로 밀림
8️⃣ element 지우는 법
evenNumbers.removeAll()
evenNumbers = []
evenNumbers.remove(at:0)
//특정 index 삭제
9️⃣ 값 변경
evenNumbers[0] = -2
evenNumbers[0...2] = [-2, 0, 2]
🔟 순서 바꿔치기
evenNumbers.swapAt(0,1)
//0과 1, 두 인덱스 값을 서로 바꿔치기함
1️⃣1️⃣ loop 사용
for num in evenNumbers {
print(num)
}
for (index,num) in evenNumbers.eumerated(){
print("idx: \(index), value: \(num)")
}
//enumerated 함수는 (index, value)로 이루어진 tuple을 리턴하는 함수
그외
evenNumbers.dropFirst(3)
//앞에 3개 빼고 보여줘 (실제 array에는 영향 안끼침)
evenNumbers.dropLast()
//괄호 안에 아무것도 없으면 1
evenNumbers.prefix(3)
//앞의 3개만 가져오기
evenNumbers.suffix(3)
//뒤의 3개만 가져오기
이름(의미) 단위 사용할 때 좋음
key -> value
이때 key는 unique(유일)해야함
cf) Dictionary(의미기반) vs Array(순서기반)
1️⃣
var scoreDic: [String:Int] = ["Jason":80, "Jay":95, "Jake":90]
//String:Int = key:value
2️⃣
var ScoreDic: Dictionary <String, Int> = ["Jason":80, "Jay":95, "Jake":90]
ScoreDic["Jason"] //80
ScoreDic["없는 값"] //nil
//optional
1️⃣ 비우는 법
scoreDic = [:]
2️⃣ 비었는지 확인해보기
scoreDic.isEmpty
3️⃣ 항목 갯수 카운트
scoreDic.count
4️⃣ 기존 항목 업데이트
scoreDic["Jason"] = 99
5️⃣ 항목 추가
scoreDic["Jack"] = 100
6️⃣ 항목 제거
scoreDic["Jack"] = nil
7️⃣ for loop
for (name, score) in scoreDic {
print("\(name), \(score)")
}
for key in scoreDic.keys{
print(key)
}
중복이 없는 유니크한 아이템 사용할 때 + 순서가 중요하지 않을 때
var someSet: Set<Int> = [1,2,3,1]
//{2,3,1} -> 중복된 값은 삭제하고 보여줌
someSet.isEmpty
someSet.count
someSet.contains(4) // False
someSet.insert(5)
someSet.remove(1)
이름이 없는 method, 함수
기능을 수행하는 코드블록의 특별한 타입 -> 정확히는 함수가 closure의 한 타입
closure가 어떤 쓸모가 있는가! 실무에서 어떻게 쓰이는지?
Completion Block
: 어떤 일이 끝나고 무언가를 수행해야할 때 사용함 (무언가를 수행시키는 것이 closure)
High order Functions
: input으로 함수를 받을 수 있는 함수 (input으로 closure가 들어감)
let choSimpleClosure = {
}
choSimpleClosure()
let choSimpleClosure = {
print("closure 입니다")
}
choSimpleClosure()
let Closure: (String) -> Void = { name in
print("이름은 \(name)입니다")
}
//void: output이 없다는 뜻
Closure("린다")
let Closure: (String) -> String = { name in
let message = "\(name)"
return message
}
let result = Closure("린다")
func thisFunction(closure:() -> Void) {
print("closure")
closure() //이걸 꼭 추가해야함
}
thisFunction(closure: {
print("closure")
})
func Function(message: String, closure: () -> Void){
print("\(message)")
closure()
}
Function (message:"~~", closure: {
print("~~")
})
Function(message:"~~") {
print("~~")
}
var multiplyClosure: (Int, Int) -> Int = { (a:Int, b: Int) -> Int in
return a*b
}
var multiplyClosure: (Int, Int) -> Int = {a,b in
return a*b
}
var multiplyClosure: (Int, Int) -> Int = { $0 * $1 }
let result = multiplyClosure(4,2)
func operateTwoNum(a:Int, b:Int, operation: (Int,Int)->Int)->Int {
let result = operation(a,b)
return result
}
operateTwoNum(a: 4, b: 2, operation: multiplyClosure)
var addclosure: (Int,Int) -> Int = {a,b in
return a+b
}
operateTwoNum(a: 4, b: 2) { a,b in
return a/b
}
closer한테 capture되면 해당 scope를 벗어나도 사용할 수 있음
let voidClosure: () -> Void = {
print("iOS")
}
//input, output 없는 메소드 만들 수 있음
var count = 0
let incrementer = {
count += 1
}