Swift.Closure(조금 더 공부 후에..)

junseole·2021년 8월 13일
0

Swift-Basic

목록 보기
6/12
post-thumbnail

스위프트 프로그래밍 3판을 보고 정리한 내용입니다.

클로저(Closure)

변수나 상수가 선언된 위치에서 참조를 획득하고 저장할 수 있다.

이를 변수나 상수의 클로징이라고 하며 클로저는 여기서 착안된 이름이다.

클로저의 형태

  • 이름이 있으면서 어떤 값도 획득하지 않은 전역함수의 형태
  • 이름이 있으면서 다른 함수 내부의 값을 획득할 수 있는 중첩된 함수의 형태
  • 이름이 없고 주변 문맥에 따라 값을 획득할 수 있는 축약 문법으로 작성한 형태

클로저의 특징

  • 매개변수와 반환 값의 타입을 문맥을 통해 유추할 수 있기 때문에 매개변수와 반환 값의 타입을 생략할 수 있다.
  • 단 한 줄의 표현만 들어있다면 암시적으로 이를 반환 값으로 취급한다.
  • 축약된 전달인자 이름을 사용할 수 있다.
  • 후행 클로저 문법을 사용할 수 있다.

기본 클로저

일반적인 스타일

let names:[String] = ["james","eric","junseole","omega"]


func reveredSort(first : String, second : String) -> Bool{
    return first > second
}

let reveredName: [String] = names.sorted(by: reveredSort)
print(reveredName) //["omega", "junseole", "james", "eric"] 출력

클로저를 이용해 직접 전달하는 경우

let names:[String] = ["james","eric","junseole","omega"]

let reveredName: [String] = names.sorted(by: {(first:String ,second: String) -> Bool in first > second})
print(reveredName) //["omega", "junseole", "james", "eric"] 출력

이러한 방법을 사용할경우 좀 더 간결해지고 직관적인 코드를 작성할 수 있다.

후행 클로저

클로저가 조금 길어진다거나 가독성이 조금 떨어진다면 후행클로저 기능을 사용하면 해결할 수 있다.

let names:[String] = ["james","eric","junseole","omega"]

후행 클로저 사용
let reveredName: [String] = names.sorted(){(first:String ,second: String) -> Bool in first > second}
print(reveredName) //["omega", "junseole", "james", "eric"] 출력

// sorted() 메서드의 소괄호까지 생략 가능
let reveredName: [String] = names.sorted{(first:String ,second: String) -> Bool in first > second}
print(reveredName)

클로저 표현 간소화

문맥을 이용한 타입 유추

//클로저의 매개변수 타입과 반환 타입을 생략하여 표현할 수 있다.
let reveredName: [String] = names.sorted{(first,second) -> Bool in first > second}

단축 인자 이름

// 단축 인자 이름을 사용한 표현
let reveredName: [String] = names.sorted{
  return $0 > $1}

// return 을 생략해서 더 줄일 수 있다.
let reveredName: [String] = names.sorted{$0 > $1}

값 획득

클로저는 자신이 정의된 위치의 주변 문맥을 통해 상수나 변수를 획득 할 수 있다.

이유 : 클로저는 비동기 작업에 많이 사용되기 때문

func makeIncrementer(forIncrement amount :Int) -> (() -> Int){
    var runningTotal = 0
    func incrementer() -> Int{
        runningTotal += amount
        return runningTotal
    }
    return incrementer
}

let incrementByTwo:(() -> Int) = makeIncrementer(forIncrement: 2)

let first:Int = incrementByTwo() //2
let second:Int = incrementByTwo() //4
let third:Int = incrementByTwo() //6

let incrementByTen:(() -> Int) = makeIncrementer(forIncrement: 10)

let ten:Int = incrementByTen() //10
let twenty:Int = incrementByTen() //20
let thirty:Int = incrementByTen() //30

클로저는 참조 타입

클로저는 참조 타입이다.

탈출 클로저 (추후에 추가 예정)

함수의 전달인자로 전달한 클로저가 함수 종료 후에 호출될 때 클로저가 함수를 탈출한다고 표현한다.

@escaping 키워드를 사용하여 클로저가 탈출하는 것을 허용한다고 명시해줄 수 있다.

자동 클로저 (추후에 추가 예정)

함수의 전달인자로 전달하는 표현을 자동으로 변환해주는 클로저

profile
Swift와 함께 여행중입니다.

0개의 댓글