iOS 개발자/swift 기초

스위프트 기초5 (collection, closure, first class type)

FDEE 2021. 2. 15. 16:44

강의 - www.fastcampus.co.kr/dev_online_iosapp

 

iOS 앱 개발 올인원 패키지 Online. | 패스트캠퍼스

차근차근 따라하다 보면 어느새 나만의 iOS 앱을 개발할 수 있게 됩니다.

www.fastcampus.co.kr

깃허브 - github.com/FreeDeveloper97/iOS-Study-FastCompus

 

FreeDeveloper97/iOS-Study-FastCompus

Contribute to FreeDeveloper97/iOS-Study-FastCompus development by creating an account on GitHub.

github.com

06. 스위프트 Collection

" closure "

 

" closure "

Closures are self-contained blocks of functionality that can be passed around and used in your code.

 

즉 first class type 이며 이름이 없는 메소드 개념이다

링크 - docs.swift.org/swift-book/LanguageGuide/Closures.html

 

※ first class type ※

1. 변수에 할당할 수 있다

2. 인자로 받을 수 있다

3. 리턴할 수 있다

※ closure의 사용 목적 ※

1. completion block : 비동기에서 앞선 작업이 종료된 후 작업이 수행될 경우 closure를 사용한다

2. higher order functions : 곡예함수(함수로 인자로 받을 수 있는 함수)를 즉시 생성하여 사용할 때 closure를 사용한다

※ closure의 3가지 타입 ※

1. global 함수 : func

2. nested 함수

3. closure expressions : 일반적인 closure

 

 

 

" closure - 형태 (이름 없이 사용하는 경우) "

" closure - 형태 (이름을 넣어 사용하는 경우) "

" closure - no input, no output 형태 "

// ex1) 초심플 closure
let choSimpleClosure = {}

choSimpleClosure()
// ex2) 코드블록을 구현한 clsure
let choSimpleClosure2 = {
    print("Hello, 클로져, 코로나 하이!")
}

choSimpleClosure2()
/* closure : No Input -> No Output */
let voidClosure: () -> Void = {
    print("iOS Hello")
}
voidClosure

" closure - inout, no output 형태 "

// ex3) 인풋 파라미터를 받는 closure
let choSimpleClosure3: (String) -> Void = { name in
    print("Hello, 클로져, 코로나 하이! 나의 이름은 \(name) 입니다")
}

choSimpleClosure3("Jason")

" closure - input, output 형태 "

이름을 넣어 이용하는 경우

// ex4) 값을 리턴하는 closure
let choSimpleClosure4: (String) -> String = { name in
    let message = "iOS 개발 만만세, \(name)님 경제적 자유를 얻으실 거에요!"
    return message
}

let result = choSimpleClosure4("Jason")
print(result)
//정석대로 사용하는 방법
var multiplyClosure: (Int, Int) -> Int = { (a: Int, b: Int) -> Int in
    return a * b
}
//간편하게 사용하는 방법
var subClosure: (Int, Int) -> Int = { a, b in
    return a - b
}
//제일 짧은코드
var sumClosure: (Int, Int) -> Int = { $0 + $1 }

클로저를 사용하여 값을 받아오는 경우

let result = multiplyClosure(4, 2)
let result2 = subClosure(4, 2)
let result3 = sumClosure(4, 2)

 

" closure - closure를 파라미터로 받는 함수 "

// ex5) closure를 파라미터로 받는 함수
func someSimpleFunction(choSimpleClosure: () -> Void) {
    print("함수에서 호출이 되었어요")
    choSimpleClosure()
}
//함수 실행
someSimpleFunction(choSimpleClosure: {
    print("헬로 코로나 from closure")
})

// print("함수에서 호출이 되었어요") 실행 -> print("헬로 코로나 from closure") 실행된다

" closure - closure를 포함한 파라미터를 받는 함수

(trailing closure) "

1. 반환값이 없는 함수의 경우

// ex6) trailing closure
func someSimpleFunction(message: String, choSimpleClosure: () -> Void) {
    print("함수에서 호출이 되었어요, 메세지는 \(message)")
    choSimpleClosure()
}
// 함수 실행
someSimpleFunction(message: "코로나 극혐", choSimpleClosure: {
    print("from closure")
})
someSimpleFunction(message: "코로나 극혐") {
    print("from closure")
}

// print("함수에서 호출이 되었어요, 메세지는 \("코로나 극혐")") 실행 ->
// print("from closure") 실행된다

2. 반환값이 있는 함수의 경우

/* closure를 파라미터로 받는 함수 */
func operateTwoNum(a: Int, b: Int, operation: (Int, Int) -> Int) -> Int {
    let result = operation(a, b)
    return result
}

 

3. 반환값이 있는 함수 사용의 경우

operateTwoNum(a: 4, b: 2, operation: multiplyClosure)
operateTwoNum(a: 4, b: 2, operation: sumClosure)
operateTwoNum(a: 4, b: 2) {a, b in
    return a / b
}

 

※ closure - capturing values ※

scope를 벗어난 값이어도 사용이 가능한 개념 (scope 밖의 값을 접근)

/* capturing values */
/* scope를 벗어나더라도 사용이 가능한 개념 */
var count = 0

let incrementer = {
    count += 1
}

incrementer()
incrementer()
incrementer()
incrementer()
count