swift 공부

[arcjeen] 5. swift closure

arcjeen 2017. 3. 21. 16:57


클로저(Closure)


일회용 함수를 작성할 수 있는 구문. 일회용 함수란 한번만 사용할 구문들의 집합이면서 그 형식은 함수로 작성되어야하는 제약 조건이 있을 때 만들어 사용 할 수 있는 함수이다.

일회용 함수는 굳이 함수의 이름을 작성할 필요없이 생략된다는 점에서 익명 함수라고 부르기도 한다.


objective -c의 블록과 같은 개념.

또는 자바 파이썬의 람다함수.


표현식


func 키워드를 생략하며 함수의 이름 또한 생략한다.


{ (매개변수) -> 반환타입 in

구문

}


{ ( ) -> () in

print("i am closure");

}


{ () -> Void in

print("i am closure")

}


//상수나 변수에 클로저표현식을 할당 후 실행

let f = { () -> Void in

print("i am closure");

   }

f();


//상수나 변수에 할당 하지 않고 실행


({ (s1:Int s2:String) -> void in

print("\(s1), \(s2)")

})(1,"closure")



일반 함수를 closure로 변경하는 예제


let value = [1, 9, 5, 7, 3, 2];


//내림차순 정렬        

        func order(s1:Int, s2:Int) -> Bool {

            

            if s1 > s2{

                return true;

            }else{

                return false;

            }

            

        }

        

        value.sorted(by:(order));




//closure 식으로 변환


value.sort( { (s1:Int, s2:Int) -> Bool in

if s1> s2{

return true;

}else{

return false;

}

});


//closure식을 한줄로 변환


sorted(by: { (s1:Int, s2:Int) -> Bool in return s1 > s2 });


//비교구문은 자동으로 return형을 Bool형으로 간주하기때문에 bool 생략


sorted(by:(s1:Int, s2:Int) in return s1 > s2 });

//매개변수 타입 어노테이션 생략

value.sorted(by:{s1, s2 in return s1 > s2 });

//매개변수 생략 
//매개변수가 생략되면 매개변수명 대신 $0, $1, 와같은 이름으로 할당된 내부 상수를 이용할 수 있다. 매개변수가 생략되면 실행구문만 남기때문에 in 키워드로 클로저 선언과 실행을 구분할 필요가 없기때문에 in 키워드 또한 생략 가능하다.

value.sorted(by:{$0>$1});

//연산자 생략

value.sorted(by: > );


* 일회성 함수의 간결성을 강화하여 코드의 숫자를 줄일 수 있다는 점에서는 강력하다고 느껴지지만 유지보수의 측면에서 봤을때 무분별한사용은 하지않는게 좋을것같다....