23.01.09 학습일기

24. Closure_1

closure는 func, class, struct 처럼 이름으로서 정의되지 않고 { } 안으로 정의 된다

{ } 안에 타입과 구현부를 같이 써야 하기 때문에, in으로 구분함

=> 타입 in 구현부

 

// function (named closure)

func plus(a: Int, b: Int) -> Int {

return a+b

}

 

// closure (unnamed closure)

{ (a: Int, b: Int) -> Int in

return a+b

} // 하지만 이렇게만 쓰면 에러남

 

// 변수나 상수에 closure를 대입해야 사용 가능

var myClosure = { (a: Int, b: Int) -> Int in

return a+b

} // 이렇게 써야함

 

 

plus(a: 10, b: 20)

myClosure(10, 20) / myClosure(a: 10, b: 20)으로 쓰면 에러남. 값만 써주면 됨. argument label 사용 할 수 없음

 

var myClosure = { (a a: Int, b b: Int) -> Int in // argument label 사용 불가

return a+b

}

 

// Function의 parameter에 closure를 넣어서 사용하는 방식

func f1() {

print("작업 중..")

print("작업 중..")

}

func f2() {

print("작업완료처리")

}

f1()

f2() // f1() 다음에 f2()가 호출되어야 하는 함수가 있다. But 따로 써져 있기 때문에 나중에 사용 의도를 제대로 파악 못할 수 있음

 

이를 방지하기 위한 첫 번째 방법은?

 

func f1() {

print("작업 중..")

print("작업 중..")

f2()

}

func f2() {

print("작업완료처리")

}

f1() // f1() 안에 f2()를 삽입하여 실행하는 방법. But 코드 자체만 보면 f1()에 f2()가 있을 것이라고 예상하기 힘듦

 

그래서 두 번째 방법을 사용한다. 바로 Function의 parameter에 closure를 넣어서 사용하는 방식.

func f10(myClosure: () -> Void) { // f20을 호출할 것이기 때문에 f20으로기준으로 받는 값 없고() 리턴 값 없음 Void

print("작업 중..")

print("작업 중..")

myClosure()

}

func f20() {

print("작업완료처리")

}

f10(myClosure: { () -> Void in f20() } ) // 타입과 구현부 in 으로 구분, 작업 중.. 작업 중.. 작업완료처리 출력됨

f10(myClosure: { f20() } ) // 위의 내용 일부 생략

f10{ f20() } // 위의 내용 일부 생략

f10 {

f20()

}

func f10(myClosure: () -> Void) {

print("작업 중..")

myClosure()

}

func 20() {

print("작업완료처리")

}

f10{f20()}


25. Closure_2

// func + closure

func myFunc(closure: () -> Void) {

}

-----------------------------------------

// func + closure 2

func myFunc2(closure1: () -> Void, closure2: () -> Void) {

print("func")

}

 

myFunc2 {

print("closure1")

} closure 2:{ // 두 번째 파라미터 이름은 생략 불가능

print("closure2")

}

------------------------------------------

// func + closure 3

func myFunc3(closure1: () -> Void, closure2: () -> Void, closure3: () -> Void) {

print("func")

closure1()

closure2()

closure3()

}

 

myFunc3 {

print("c1")

} closure2: {

print("c2")

} closure3: {

print("c3")

}

------------------------------------------

// parameter : Int, closure

func myFunc4(a: Int, closure: () -> Void) {

print(a)

closure()

}

 

myFunc4(a: 50) {

print("ccc")

}

------------------------------------------

// closure 안에 parameter가 있는 경우

func myFunc5(completion: (Int) -> Void) {

print("func5...")

let total = 100

completion(total)

}

 

myFunc5 { total in

print(total.description + "점")

}

 

// closure + function

func showScore(a: Int) { // func에서는 리턴타입 Void일 경우, 생략 가능

print((a+10).description + "점")

}

myFunc5(completion: showScore)

------------------------------------------

// closure + return

func myFunc6(completion: () -> String) {

print("myFunc6")

print(completion() + "hi")

}

 

myFunc6 {

return "aaa" // 리턴 타입 일치해야 함

}

댓글을 작성해보세요.

채널톡 아이콘