iOS 6강 스위프트 collection

린다·2021년 1월 24일
0

iOS beginner

목록 보기
5/14
post-thumbnail

Collection : 변수를 관리하는 방법

  • Array
  • Dictionary
    // 이 둘은 필수 개념
  • Set
  • Closure

1. Array

데이터를 순서대로 담을 수 있게 해줌
✔️ element가 모두 동일한 타입이어야함
✔️ 순서가 있음 (순번: index, 0부터 시작)

Array는 언제 사용하면 좋지?
1. 순서가 있는 아이템
2. 아이템의 순서를 알면 유용할 때

array 만드는 법

1️⃣

var evenNumbers: [Int] = [2,4,6,8]

2️⃣

let evenNumbers: Array <Int> = [2,4,6,8]

array에 추가하는 법

evenNumbers.append(10) //evenNumbers를 let으로 만드는 경우 오류남

여러개 추가

1️⃣

evenNumbers += [12, 14, 16]

2️⃣

evenNumbers.append(contentsof:[18,20])

array 속성 활용

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개만 가져오기

2. Dictionary

이름(의미) 단위 사용할 때 좋음

key -> value
이때 key는 unique(유일)해야함

cf) Dictionary(의미기반) vs Array(순서기반)

dictionary 만드는 법

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

dictionary 속성 활용

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)
}

3.Set

중복이 없는 유니크한 아이템 사용할 때 + 순서가 중요하지 않을 때

set 만들기

var someSet: Set<Int> = [1,2,3,1]
//{2,3,1} -> 중복된 값은 삭제하고 보여줌

set 속성 활용

someSet.isEmpty
someSet.count
someSet.contains(4) // False
someSet.insert(5)
someSet.remove(1)

4. Closure

이름이 없는 method, 함수
기능을 수행하는 코드블록의 특별한 타입 -> 정확히는 함수가 closure의 한 타입

closure가 어떤 쓸모가 있는가! 실무에서 어떻게 쓰이는지?

  1. Completion Block
    : 어떤 일이 끝나고 무언가를 수행해야할 때 사용함 (무언가를 수행시키는 것이 closure)

  2. High order Functions
    : input으로 함수를 받을 수 있는 함수 (input으로 closure가 들어감)

closure 형식

  1. 심플 closure
let choSimpleClosure = {

}
choSimpleClosure()
  1. 코드블록
let choSimpleClosure = {
    print("closure 입니다")
}
choSimpleClosure()
  1. input parameter 받는 클로져
let Closure: (String) -> Void = { name in
    print("이름은 \(name)입니다")
}
//void: output이 없다는 뜻
Closure("린다")
  1. 값을 리턴
let Closure: (String) -> String = { name in
    let message = "\(name)"
    return message
}

let result = Closure("린다")
  1. 파라미터로 closure를 받는 함수
func thisFunction(closure:() -> Void) {
    print("closure")
    closure() //이걸 꼭 추가해야함
}

thisFunction(closure: {
    print("closure")
})
  1. Trailing Closure
func Function(message: String, closure: () -> Void){
    print("\(message)")
    closure()
}

Function (message:"~~", closure: {
    print("~~")
})

Function(message:"~~") {
    print("~~")
}

closure 기본 개념

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
}

capturing values

closer한테 capture되면 해당 scope를 벗어나도 사용할 수 있음

let voidClosure: () -> Void = {
    print("iOS")
}
//input, output 없는 메소드 만들 수 있음

var count = 0
let incrementer = {
    count += 1
}

0개의 댓글