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" // 리턴 타입 일치해야 함
}
댓글을 작성해보세요.