본문 바로가기

교육/Swift

[swift] 클로저

1. 클로저

익명의 함수

함수 이름없이 함수 구현

objc의 block


2. 샘플 코드

// Closure, Lambda, Block, Annonymous Function

// 모두 비슷한 개념


// Closure : 익명의 함수 개념

func Sort(inout ar : Array<Int> , compare : (Int, Int)->Bool)

{

    for i in 0...ar.count-2

    {

        for j in i+1...ar.count-1

        {

            //            if ar[i] > ar[j]

            if compare(ar[i], ar[j]) // 사용자가 인자로 결정

            {

                let temp = ar[i]

                ar[i] = ar[j]

                ar[j] = temp

            }

        }

    }

}

// Sort 전달할 비교함수

func cmp1(a:Int, _ b:Int) -> Bool{return a<b}

func cmp2(a:Int, _ b:Int) -> Bool{return a>b}

var x = [1,3,5,6,9,2,4,6,8,10]

print(x)

// inline 클로져 :  함수 ()안에 만드는

Sort(&x,compare : cmp1) // 매번 함수를 찾아가서 봐야하니 블럭으로 넘기자(이것이 스위프트 클로저)

Sort(&x, compare: {(a:Int,b:Int)->Bool in return a<b }) // {} 사이에 함수 인자 in 리턴값, 구현이 여러줄이면 세미콜론 여러개 장점:한눈에 알수있음

Sort(&x, compare: {(a:Int,b:Int) in return a<b }) // 리턴문 생략 가능

Sort(&x, compare: {(a,b) in return a<b }) // 타입 생략 가능

Sort(&x, compare: {a,b in return a<b }) // 소괄호도 생략 가능

Sort(&x, compare: {a,b in a<b }) // 리턴도 생략 가능

Sort(&x, compare: {$0 < $1 }) // 약속된 언어

Sort(&x, compare: <) // 2개인것도 추론 가능하기 때문에

// trailing 클로져 : 함수()안이 아닌 ()밖에 클로져를 만드는 표현식, 마지막 인자만 가능

Sort(&x) {$0 < $1 }

print(x);


// 클로저와 타입 - swift에서 클로져는 결국 함수

func foo(num:Int)

{

    let f = { (a: Int, b:Int)->Int in return a+b+num} // num 쓸수있다

    showType(f)

    print(f(1,2))

}

'교육 > Swift' 카테고리의 다른 글

[swift] 구조체와 클래스  (0) 2016.08.05
[swift] enum  (0) 2016.08.05
[swift] 함수 고급  (0) 2016.08.04
[swift] 제어문  (0) 2016.08.04
[swift] 반복문  (0) 2016.08.04