-
[Swift] 클로저 (Closures)카테고리 없음 2022. 12. 2. 11:55
https://jusung.gitbook.io/the-swift-language-guide/language-guide/07-closures
클로저 (Closures) - The Swift Language Guide (한국어)
위 코드는 각 자리수를 구해서 그 자리수를 문자로 변환하고, 10으로 나눠서 자리수를 바꾸며 문자로 변환하는 것을 반복합니다. 이 과정을 통해 숫자 배열을, 문자 배열로 바꿀 수 있습니다. numb
jusung.gitbook.io
import UIKit //String 을 반환하는 클로저 let myName : String = { //myName으로 들어간다 return "단비" }() print(myName) //클로저 정의 //받은 매개변수 타입 지정해주고 최종적으로 리턴해주는 값을 in 을 붙임 let myRealName : (String) -> String = { (name: String) -> String in return "개발하는 \(name)" } myRealName("단비") //return이 없는 void 상태로 반환하기 let myRealNameLogic : (String) -> Void = { (name: String) in print("개발하는 \(name)") } myRealNameLogic("단비")
출력결과
단비 개발하는 단비
매개변수로서의 클로저
import UIKit // () -> Void 반환하는 타입이 없음 func completion(){ } //completion 이라는 클로저를 매개변수로 가지는 메소드 정의 func sayHi(completion: () -> Void){ print("sayHi() called") sleep(2) //2초 멈추기 completion() } //메소드 호출부 에서 이벤트 종료를 알 수 있다. sayHi(completion: { print("2초가 지났다. 1") }) sayHi(){ print("2초가 지났다. 2") } sayHi(){ print("2초가 지났다. 3") } //매개변수로서 데이터를 반환하는 클로저 func sayHiWithName(completion: (String) -> Void){ print("sayHiWithName() called") sleep(2) //클로저를 실행과 동시에 데이터 반환 completion("오늘도 빡코딩") } sayHiWithName(completion: { (comment: String) in print("2초 뒤 그가 말했다. ", comment) }) sayHiWithName(completion: { comment in print("2초 뒤 그가 말했다. ", comment) }) sayHiWithName { print("2초 뒤 그가 말했다. ", $0) } //여러개의 데이터를 여러개 반환하는 클로저 func sayHiWithFullName(completion: (String, String) -> Void){ print("sayHiWithFullName() called") sleep(2) //클로저를 실행과 동시에 데이터 반환 completion("오늘도 빡코딩", "화이팅") } sayHiWithFullName { first, second in print("첫번째 : \(first), 두번째 :\(second)") } sayHiWithFullName { print("첫번째 : \($0), 두번째 :\($1)") } //기본형은 없다 func sayHiOptional(completion: (() -> Void)? = nil){ print("sayHiOptional() called") sleep(2) completion?() } sayHiOptional() //비동기로 처리할때 이벤트를 컴플레션 클로저를 넣어서 완료됐다는걸 전달하고 싶을때 사용함 // 클로저 자체를 nil 로 만들면 됨 sayHiOptional(completion: { print("2초가 지났다.") }) // _ 언더바는 생략이라는 의미임 // 매개변수를 받고 싶지 않을때 매개변수 자리에 언더바를 쓰면 됨 var Numbers : [Int] = [0, 1, 2, 3, 4, 5] var transformedNumbers_1 = Numbers.map { aNumber in return "숫자 : \(aNumber)" } var transformedNumbers_2 = Numbers.map { (aNumber: Int) -> String in return "숫자 : \(aNumber)" } var transformedNumbers_3 = Numbers.map{ return "숫자: \($0)" }
출력 결과
sayHi() called 2초가 지났다. 1 sayHi() called 2초가 지났다. 2 sayHi() called 2초가 지났다. 3 sayHiWithName() called 2초 뒤 그가 말했다. 오늘도 빡코딩 sayHiWithName() called 2초 뒤 그가 말했다. 오늘도 빡코딩 sayHiWithName() called 2초 뒤 그가 말했다. 오늘도 빡코딩 sayHiWithFullName() called 첫번째 : 오늘도 빡코딩, 두번째 :화이팅 sayHiWithFullName() called 첫번째 : 오늘도 빡코딩, 두번째 :화이팅 sayHiOptional() called sayHiOptional() called 2초가 지났다.