관리 메뉴

java,javascript,android,php,sql,공부용,메모용

클로저, closures / Xcode SwiftUI Playground 공부 본문

모바일/SwiftUI ios 공부

클로저, closures / Xcode SwiftUI Playground 공부

yy_dd2 2021. 11. 29. 14:31
반응형

클로저

 1. 참조타입

 2. 코드에서 전달 및 사용할 수 있는 독립기능 블록 (클로저는 중괄호({})로 감싸진 실행 가능한 코드 블럭)

 3. 일급 객체의 역할을 할 수 있다

 (일급객체란 : 전달 인자로 보낼 수 있고, 변수/상수 등으로 저장하거나 전달할 수 있고 함수로 반환할 수 있다.)

 4. 보통 클로저라고 하면 이름없는 함수 익명함수를 지칭한다

 Named Closure, Unnamed Closure (보통 Unnamed 클로저를 말함)

 

클로저는 다른 프로그래밍 언어의 람다(lamdas)와 비슷한 개념이다

클로저의 최적화로 깔끔하고 명확한 스타일로 코드를 작성할 수 있다.

1. 문맥(context)에서 인자 타입과 반환 타입 추론

2. 단일 표현식 클로저 암시적 변환

3. 축약된 인자 이름

4. 후위 클로저 문법

 

클로저 표현식

 클로저 표현식
 { (매개 변수)-> 리턴 타입 in
    실행구문
 }

// 파라미터와 리턴타입이 둘다 없는 클로저

let hello = { () -> () in
    print("hello")
}
hello()

// 파라미터와 리턴 타입이 있는 클로저

let hello2 = { (name: String) -> String  in
    return "Hello, \(name)"
}
// 주의 클로저에서 전달인자 레이블을 사용하지 않는다. 파라미터 네임만 사용된다
// 에러 전달인자 레이블을 사용하면 안됨
// hello2(name: "asd")
hello2("young")

 

// 클로저를 함수에 파라미터로 전달하는 함수

func doSomething(closure: ()    ->  () ) {
    closure( )
}
doSomething(closure: {  ( )  ->  ( )    in
    print("hello3-1")
} )
// 클로저가 길어지거나 가독성이 떨어지면
// 후위 클로저 문법을 사용할 수 있다.
// 맨마지막에 전달되는 전달인자에게만 해당된다
doSomething( )  {
    print("hello3-2")
}
// 한개의 클로저 일 경우 소괄호 생략가능
doSomething {
    print("hello3-3")
}

// 함수의 반환타입으로 클로저를 사용할 수 있다.

// 반환타입에 클로저를 입력해 클로저를 반환할 수 있다
func doSomething2( ) ->  ( ) ->  ( ) {
    return  {   ( ) ->  ( ) in
        print("hello444")
    }
}
doSomething2()()

 

// 매개변수에 클로저가 여러개 있는경우

// 매개변수에 클로저가 여러개 있는경우
// 다중 후위 클로저 정의
func doSomething3(success:  ( ) ->  ( ), fail:  ( )   ->  ( ) )   {
    
}
doSomething3 {
    <#code#>
} fail: {
    <#code#>
}

 

// 클로저 표현 간소화

// 클로저 표현 간소화
func doSomething4( closure: (Int, Int, Int) -> Int  )   {
    closure(1,2,3)
}

doSomething4 { (a, b, c)  in
    return a+b+c
}
// 축약된인자이름
doSomething4(closure: {
    return $0+$1+$2
} )
doSomething4(closure:   {
    $0+$1+$2
})
doSomething4()  {
    $0+$1+$2
}
doSomething4    {
    $0+$1+$2
}

 

반응형
Comments