카테고리 없음
[Swift] 클로저 (Closures)
단비_danbee
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초가 지났다.