본문 바로가기
iOS

[iOS 앱 개발] Swift 클로저(Closure), 후행 클로저

by Dokon Jang 2022. 9. 16.
반응형

자바 .Net에서 람다식(Lambda) 즉 익명함수로 알고 있던 것이 Swift에서는 클로저(Closure)라고 합니다.
클로저를 사용하면 코드는 간결해지지만, 불필요하게 사용하면 가독성이 떨어질 것 같습니다.
람다식을 거의 사용하지 않고 있지만, Swift에서는 친숙해지기로 했습니다.^^

 

클로저 표현식 구문
{ (파라미터) -> 리턴타입 in
    실행 구문
}

 

파라미터와 리턴이 없는 경우
var hello = {() -> Void in 
    print("Hello")
    print("World")
}

hello()

 

파라미터는 있고, 리턴이 없는 경우
var hello = {(name:String) -> Void in 
    print("Hello")
    print(name)
}

hello("Korea")

 

파라미터와 리턴이 있는 경우
var hello = {(name:String) -> String in 
    return "Hello " + name
}

print(hello("Korea"))

 

함수를 정의하여 배열 정렬
var names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]

func sortArray (s1:String, s2:String) -> Bool {
    // 오름차순(ASC) : s1 < s2
    // 내림차순(DESC : s1 > s2
    return s1 > s2
}

names.sort(by:sortArray)

print(names)

 

클로저 함수를 정의하여 배열 정렬
var names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]

var sortArray = {(s1:String, s2:String) -> Bool in
    return s1 < s2
}

names.sort(by:sortArray)

print(names)

 

후행 클로저
마지막의 파라미터가 클로저 인 경우만 후행 클로저를 사용할 수 있다.
func f(a:Int, b:Int, cal:(Int, Int) -> Int) -> Int{
    return cal(a, b)
}

var value : Int

value = f(a:1, b:2, cal:{(_a:Int, _b:Int) -> Int in return _a + _b})

// 후행 클로저
value = f(a:1, b:2){
    (_a:Int, _b:Int) -> Int in
    return _a * 2 + _b * 2
}

print(value)

 

배열의 sort 함수의 파라미터로 클로저를 사용해서 정렬
var names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]

// 전체 클로저 표현식
names.sort(by:{(s1:String, s2:String) -> Bool in return s1 < s2})

// 파라미터타입 추론
names.sort(by:{(s1, s2) -> Bool in return s1 < s2})

// 리턴타입 추론
names.sort(by:{(s1:String, s2:String) in return s1 > s2})

// 파라미터타입, 리턴타입 추론
names.sort(by:{(s1, s2) in return s1 < s2})
names.sort(by:{s1, s2 in return s1 < s2})


// 후행 클로저
names.sort(){
    (s1, s2) in return s1 < s2
}

print(names)

댓글0