어흥

[Swift] Closure 본문

iOS

[Swift] Closure

라이언납시오 2020. 8. 26. 09:32
728x90
반응형

[Closure]

  1) 정의 및 특징

    - 사용자의 코드 안에서 전달되어 사용할 수 있는 로직을 가진 일급 객체로, {}로 구분된다

    - 일급 객체는 전달 인자로 보낼 수 있고, 변수/상수 등으로 저장하거나 전달할 수 있으며, 반환값도 가능하다

    - 참조타입이며, 함수는 이름이 있는 클로저다

 

  1-1) 함수 <-> 클로저

Function(Global) Closure
이름이 있다 이름 없다
func 키워드 필요 func 키워드 필요 없다
인자 받을 수 있다
값 Return 가능
변수로 할당할 수 있다
일급 객체(First Class Type)

 

  2) 사용법

 {(parameters) -> return type in 
 	statements
 }

  3-1) 예시 

@IBAction func hello(_sender:Any){
        let alert = UIAlertController(title:"Welcome to 어흥's Blog")
        let action = UIAlertAction(title: "OK", style:.default, handler:{action in self.pushBtn()})
    	alert.addAction(action)
        present(alert, animated:true, completion: nil)       
}

func pushBtn(){
	print("버튼이 눌렸습니다")
}

  결과

    : 특정 버튼을 누른 뒤, OK를 누르면 pushBtn() 함수가 호출되어 "버튼이 눌렸습니다" 문구가 Output창에 출력됩니다

 

 

3-2) 예시 2

//밑에 2개 모두 같은 반환값을 가진다
var multiplyClousre: (Int, Int) -> Int = {a, b in 
	return a * b
}
var multiplyClosure2: (Int, Int) -> Int  = { $0 * $1 }		//0번째 인자, 1번째 인자

let result = multiplyClosure(4,2)		//8

//두 수에 대한 연산
func operateTwoNum(a: Int, b: Int, operation: (Int, Int) -> Int) -> Int{
	let result = operation(a,b)
    return result
}

operateTwoNum(a: 4, b:2, operation: multiplyClosure2)		//8

//두 수의 합을 반환하는 클로저
var addClosure: (Int, Int) -> Int = { a, b in
	return a+b
}

operateTwoNum(a: 4, b:2, operation: addClosure)		//6

//두 수의 나눗셈에 대한 클로저를 바로 선언
operateTwoNum(a:4, b:2) { a, b in					//2
	return a/b
}

 

3-3) 예시 3

let voidClosure: () -> Void = {
	print("iOS 개발자")
}
voidClosure()					//iOS 개발자

var count = 0
let increment = {
	count+=1
}
increment()
increment()
increment()
increment()
count					//4

 

3-4) 예시 4

import UIKit
/*
 {(param) -> return type in
    statement
    ...
 */

//#1. 초 Simple Closure
let choSimpleClosure = {
    
}
choSimpleClosure()
//#2. 코드블록을 구현한 Closure
let choSimpleClosure2 = {
    print("Hello, Closure")
}
choSimpleClosure2()

//#3. 인풋 파라미터를 받는 Closure
let choSimpleClosure3: (String) -> Void = { name in
    print("Hello, Closure. My name is \(name)")
}
choSimpleClosure3("Mike")


//#4. 값을 리턴하는 Closure
let choSimpleClosure4: (String) -> String = { name in
    let message = "iOS Developer \(name)"
    return message
}
let result = choSimpleClosure4("Mike")
print(result)

//#5. Closure를 파라미터로 받는 함수 구현
func someSimpleFunction(choSimpleClosure: () -> Void){
    print("호출")
    choSimpleClosure()
}
someSimpleFunction(choSimpleClosure:  {
    print("Hello Corona")
})

//#6. Trailing Closure
func someSimpleFunction2(message: String, choSimpleClosure2: () -> Void){
    print("함수에서 호출됨. 메세지는 : \(message)")
    choSimpleClosure2()
}
someSimpleFunction2(message: "메로나" , choSimpleClosure2: {
    print("Hello Corona from Closure")
})
728x90
반응형

'iOS' 카테고리의 다른 글

[Swift] Protocol  (0) 2020.08.28
[Swift] Structure, Class  (0) 2020.08.27
[Swift] Dictionary, Set  (0) 2020.08.25
[Swift] 배열  (0) 2020.08.25
[Swift] nil + 4가지 고급 기능  (0) 2020.08.24
Comments