대조 Java 학습 Swift -- 클 로 저 (Closures)

패 킷 을 닫 는 것 은 자체 적 으로 포 함 된 함수 코드 블록 으로 코드 에서 전달 되 고 사용 할 수 있 습 니 다.제 이 해 는 코드 를 직접 사용 하고 전달 할 수 있 습 니 다. 함수 처럼 정의 되 고 호출 되 고 싶 지 않 지만 함수 의 기능 도 있 고 매개 변수 도 있 습 니 다. 값 을 되 돌려 주 는 정 보 는 함수 보다 더욱 간결 합 니 다.자바 8 에 도 패 킷 이 추가 되 었 으 나 자바 8 이하 에 서 는 패 킷 이 없 으 며 같은 기능 을 실현 하려 면 인터페이스 가 필요 하 다.다음은 sort 를 예 로 들 어 자바 와 Swift 가 패 키 지 를 닫 지 않 고 정렬 하 는 방법 을 소개 합 니 다. 먼저 자바 의 것 을 보 겠 습 니 다.
    public static void main(String[] args) {
        String[] names = {"Chris", "Alex", "Ewa", "Barry", "Daniella"};
        Arrays.sort(names, new Comparator<String>() {

            @Override
            public int compare(String s1, String s2) {
                return -(s1.compareTo(s2));
            }
        });
        for (int i = 0; i < names.length; i++) {
            System.out.println(names[i]);
        }

    }

우 리 는 콘 솔 에 정렬 된 이름 이 인쇄 되 어 있 는 것 을 보 았 다.swift 비 패 킷 을 사용 하여 같은 기능 을 실현 합 니 다. 다음 과 같 습 니 다.
let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]
func backwards(s1: String, s2: String) -> Bool {
    return s1 > s2
}
var reversed = names.sort(backwards)
print(reversed)

마찬가지 로 콘 솔 에 정렬 된 이름 을 출력 합 니 다. 자바 와 같 습 니 다. 하지만 클 로 징 을 사용 하지 않 아 도 swift 는 자바 보다 간결 합 니 다. swift 는 현대 언어 답 게 swift 의 클 로 징 은 같은 기능 을 수행 할 수 있 습 니 다.
폐쇄 식 문법 (Closure Expression Syntax)
{ (parameters) -> returnType in
    statements
}

큰 괄호 로 닫 힌 표현 식 을 둘러싸 고 작은 괄호 에 파 라 메 터 를 넣 고 화살표 뒤에 되 돌아 오 는 값 을 놓 습 니 다. in 뒤 에는 코드 문 입 니 다. 함수 와 유사 하지만 이름과 func 키워드 가 없습니다. 함수 대괄호 는 되 돌아 오 는 형식의 뒤에 쓰 여 있 고 닫 힌 것 은 모두 포함 되 어 있 습 니 다.패 킷 식 문법 은 상수, 변수, inout 형식 을 매개 변수 로 사용 할 수 있 으 며 기본 값 을 제공 할 수 없습니다.매개 변수 목록 의 마지막 에 가 변 매개 변 수 를 사용 할 수도 있 습 니 다.원본 그룹 도 매개 변수 와 반환 값 으로 사용 할 수 있 습 니 다.다음 에 우 리 는 패키지 식 으로 정렬 기능 을 실현 합 니 다.
reversed = names.sort({(s1:String,s2:String) -> Bool in return s1>s2})

함수 보다 더 간결 한 거 아니 야?
문맥 에 따라 유형 추정 (Inferring Type From Context)
정렬 패 킷 함 수 는 sort (:) 방법의 매개 변수 로 들 어 왔 기 때문에 Swift 는 매개 변수 와 반환 값 의 유형 을 추정 할 수 있 습 니 다.sort (:) 방법 은 문자열 배열 에 호출 되 기 때문에 매개 변 수 는 (String, String) - > Bool 형식의 함수 여야 합 니 다.이것 은 (String, String) 과 Bool 형식 이 패키지 표현 식 의 일부분 으로 정의 되 지 않 아 도 된다 는 것 을 의미한다.모든 유형 이 정확하게 추 정 될 수 있 기 때문에 화살표 (- >) 와 매개 변수 주 위 를 둘 러 싼 괄호 도 생략 할 수 있 습 니 다.
reversed = names.sort({s1,s2 in return s1>s2})

더 깔끔 하지?
단일 표현 식 패키지 암시 적 반환 (암시 적 Return From Single - Expression Clossures)
단일 표현 식 패 키 지 는 return 키 워드 를 생략 하여 단일 표현 식 의 결 과 를 암시 적 으로 되 돌려 줄 수 있 습 니 다. 예 를 들 어 이전 버 전의 예 를 들 어 다음 과 같이 바 꿀 수 있 습 니 다.
reversed = names.sort({s1,s2 in s1>s2})

더욱 간결 하 다.
매개 변수 이름 줄 임 말 (Shortshand Argument Names)
Swift 는 자동 으로 패 킷 을 닫 는 데 매개 변수 이름 의 줄 임 말 기능 을 제공 합 니 다. 0, 1, 2 를 통 해 패 킷 을 닫 는 인 자 를 순서대로 호출 할 수 있 습 니 다.
패 킷 식 에서 매개 변수 이름 줄 임 말 을 사용 하면 패 킷 매개 변수 목록 에서 정 의 를 생략 하고 매개 변수 이름 줄 임 말 형식 은 함수 형식 으로 추정 할 수 있 습 니 다.in 키워드 도 생략 할 수 있 습 니 다. 이 때 폐쇄 식 은 완전히 폐쇄 함수 체 로 구성 되 어 있 기 때 문 입 니 다.
reversed = names.sort({$0>$1})

충분히 간결 하지만 아직 그렇지 않 습 니 다.
연산 자 함수 (Operator Functions)
실제로 상기 예 에서 보 여 준 패키지 표현 식 을 작성 하 는 더 짧 은 방법 도 있다.Swift 의 String 형식 은 번호 (>) 이상 의 문자열 을 정의 합 니 다. 하나의 함수 로 서 두 개의 String 형식의 인 자 를 받 아들 이 고 Bool 형식의 값 을 되 돌려 줍 니 다.이것 은 sort (:) 방법의 두 번 째 매개 변수 에 필요 한 함수 유형 과 일치 합 니 다.따라서 번호 보다 큰 문자열 함 수 를 간단하게 전달 할 수 있 습 니 다. Swift 는 번호 보다 큰 문자열 함 수 를 사용 하고 싶 은 지 자동 으로 추정 할 수 있 습 니 다.
reversed = names.sort(>)

궁극 적 으로 간결 하 다.
꼬리 닫 기 (트 레일 링 클 로 저)
함수 에 긴 패 킷 표현 식 을 마지막 매개 변수 로 전달 하려 면 패 킷 을 닫 아 함수 의 가 독성 을 높 일 수 있 습 니 다.끝 에 있 는 패 킷 은 함수 괄호 뒤에 쓰 인 패 킷 표현 식 으로 함수 가 마지막 매개 변수 로 호출 하 는 것 을 지원 합 니 다.우 리 는 이런 방법 으로 정렬 을 실현 한다.
reversed = names.sort() { $0 > $1 }

실현 을 함수 의 바깥쪽 에 놓 아 가 독성 을 높 였 다.함수 가 패 킷 표현 식 의 매개 변수 만 필요 하 다 면, 패 킷 을 닫 을 때 () 를 생략 할 수도 있 습 니 다.
reversed = names.sort { $0 > $1 }

더 이상 말 하지 않 겠 습 니 다.
캡 처 값 (캡 처 값)
패 킷 을 닫 으 면 정 의 된 컨 텍스트 에서 상수 나 변 수 를 캡 처 할 수 있 습 니 다.이러한 상수 와 변 수 를 정의 하 는 원 역할 영역 이 존재 하지 않 더 라 도 패 킷 은 패 킷 함수 에서 이 값 을 참조 하고 수정 할 수 있 습 니 다.자세 한 내용 은:http://wiki.jikexueyuan.com/project/swift/chapter2/07_Closures.html#capturing_values
패 킷 닫 기 는 참조 형식 (Closures Are Reference Types)
이것 은 말 이 많 지 않 습 니 다. 자바 를 사용 한 사람 은 모두 인용 유형 을 알 고 있 습 니 다. 패 킷 을 닫 는 것 도 인용 유형 입 니 다. 이것 은 이해 하기 쉽 습 니 다.
비 탈출 폐쇄 (비 탈출 폐쇄)
패 킷 을 매개 변수 로 함수 에 전달 하지만 이 패 킷 은 함수 가 돌아 온 후에 야 실 행 됩 니 다. 우 리 는 이 패 킷 이 함수 에서 탈출 했다 고 합 니 다.이것 도 할 말 이 없 으 니 많이 연습 해 야 쓸모 가 있다.
자동 폐쇄 (자동 폐쇄)
자동 패 킷 은 함수 에 전달 하 는 매개 변수 로 자동 으로 생 성 된 패 킷 입 니 다.이 패 키 지 는 어떠한 인자 도 받 아들 이지 않 습 니 다. 호출 될 때 포 장 된 표현 식 의 값 을 되 돌려 줍 니 다.이러한 편리 한 문법 은 명시 적 인 패 키 지 를 일반적인 표현 식 으로 대체 하여 패 키 지 를 닫 는 괄호 를 생략 할 수 있 게 한다.
var customersInLine = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]
func serveCustomer(@autoclosure customerProvider: () -> String) { print("Now serving \(customerProvider())!") } serveCustomer(customersInLine.removeAtIndex(0)) 

@ autoclosure 기능 은 @ noescape 기능 을 포함 하고 있 습 니 다. 이 패 키 지 를 '탈출' 할 수 있 도록 하려 면 @ autoclosure (escaping) 기능 을 사용 해 야 합 니 다.

좋은 웹페이지 즐겨찾기