Latest web development tutorials

스위프트 폐쇄

폐쇄 (폐쇄)를 사용하거나, 코드의 파라미터 값으로 이용 될 코드의 기능 자체 포함 블록이다.

C 및 목표 - C 코드 블록 (블록) 및 익명의 기능은 매우 유사하다 다른 프로그래밍 언어에서 스위프트 폐쇄.

전역 함수와 중첩 된 기능은 실제로 특별한 폐쇄입니다.

형태의 폐쇄 :

전역 함수 중첩 된 기능 식 폐쇄
나는 이름을 가지고 있지만 모든 값을 캡처 할 수 없습니다. 이 이름이 아니라 기능 폐쇄 내의 값을 포착. 무명 폐쇄, 경량 구문을 사용하면 상황에 따라 값을 캡처 할 수 있습니다.

스위프트 폐쇄 최적화 장소를 많이 가지고 :

  1. 상황에 맞는 추론 매개 변수 및 반환 값 유형에 따라
  2. 한 줄 표현 폐쇄 암시 수익에서 (즉, 폐쇄 몸이 코드 한 줄, 당신은 수익을 생략 할 수 있습니다)
  3. (... 즉, i 번째의 인수를 나타내는 0) $ 0 $ 1과 같은 매개 변수를 이름을 단순화하기 위해 사용될 수있다
  4. 제공 후행 폐쇄 구문 (후행 폐쇄 구문)
  5. 문법

    다음은 수신 매개 변수를 정의하고 폐쇄 구문의 특정 유형을 반환합니다 :

    {(parameters) -> return type in
       statements
    }
    

    import Cocoa
    
    let studname = { print("Swift 闭包实例。") }
    studname()
    

    위의 프로그램 실행 출력은 다음과 같습니다

    Swift 闭包实例。
    

    다음과 같은 폐쇄 형은 두 개의 매개 변수를 사용하고 부울 값을 반환합니다 :

    {(Int, Int) -> Bool in
       Statement1
       Statement 2
        ---
       Statement n
    }
    

    import Cocoa
    
    let divide = {(val1: Int, val2: Int) -> Int in 
       return val1 / val2 
    }
    let result = divide(200, 20)
    print (result)
    

    위의 프로그램 실행 출력은 다음과 같습니다

    10
    

    식 폐쇄

    클로저 발현 간단한 문법 인라인 클로저의 사용을 구축하기위한 방법이다. 그 폐쇄가 간단하고 명확하게 작성할 수 있도록 폐쇄 식 구문은 약간의 최적화를 제공합니다.


    정렬 기능

    스위프트 표준 라이브러리는이 어레이의 알려진 유형 값을 정렬하는 데 사용됩니다 제공하는 폐쇄 기능에 따라 정렬됩니다, 함수 종류라는 이름의 제공합니다.

    정렬 종료 후, 정렬 (_ ^ 방법은 원고와 동일한 크기의 배열을 반환 새로운 배열 요소의 동일한 유형을 포함하고,이 요소는 적절하게 원래의 배열을 정렬 (_ ^ 방법을 수정되지 정렬되었다.

    종류 (_ : 메서드는 두 개의 인수를 사용합니다 :

    • 알려진 유형의 배열
    • 폐쇄 기능은 그 기능을 폐쇄 두 값이 동일한 유형의 요소들의 어레이를 통과해야하고 나타내는 부울 값을 반환 앞 또는 두번째 파라미터 뒤에 정렬 수신 행 끝에 펼쳐진 파라미터. 첫 번째 매개 변수 값이 두 번째 매개 변수 값 앞에 나타날 경우 폐쇄 함수가 반환 할 필요가 정렬 true 돌아가려면, 반대로 false .

    import Cocoa
    
    let names = ["AT", "AE", "D", "S", "BE"]
    
    // 使用普通函数(或内嵌函数)提供排序功能,闭包函数类型需为(String, String) -> Bool。
    func backwards(s1: String, s2: String) -> Bool {
        return s1 > s2
    }
    var reversed = names.sort(backwards)
    
    print(reversed)
    

    위의 프로그램 실행 출력은 다음과 같습니다

    ["S", "D", "BE", "AT", "AE"]
    

    첫 번째 문자열 (S1)이 두 번째 문자열 (S2)보다 큰 경우, 이전 버전과 기능은 새로운 배열은 S1의 S2 전에 나타나는 것을 나타내는, true를 돌려줍니다. 문자열에서 문자의 경우, "보다"는 "나중에 알파벳 순서로 나타납니다."의미 이는 글자 "B"는 문자 "A", 문자열 "S"는 문자열 "D"보다 큰 경우보다 더 큰 것을 의미한다. 그것은 "AE"전에 정렬됩니다 "AT", 알파벳 정렬을 반대합니다.


    매개 변수 이름의 약어

    스위프트가 자동으로 인라인 함수 매개 변수 이름의 약어를 제공, 직접 $ 1, $ 2 $ 0 매개 변수 폐쇄를 위해 호출 할 수 있습니다.

    import Cocoa
    
    let names = ["AT", "AE", "D", "S", "BE"]
    
    var reversed = names.sort( { $0 > $1 } )
    print(reversed)
    

    $ 0 제 String 형의 두 번째 매개 변수의 폐쇄 $ 1이다.

    위의 프로그램 실행 출력은 다음과 같습니다

    ["S", "D", "BE", "AT", "AE"]
    

    당신은 폐쇄 식의 매개 변수 이름 약어를 사용하는 경우 폐쇄 매개 변수 목록의 정의는 생략 할 수 있으며, 해당 매개 변수 이름 약어 유형은 기능 유형별로 추정됩니다. 키워드를 또한 생략 할 수있다.


    연산자 함수

    사실 위의 예 폐쇄 식을 작성하는 짧은 방법이있다.

    스위프트의 String 유형은보다 큼 기호 (에 정의 > 이 소요 함수로, 문자열) 구현 String 유형 매개 변수와 반환 Bool 값 유형을. 이것은와 일치 sort(_:) 방법의 제 2 파라미터의 입력 기능은 일치해야한다. 따라서, 당신은 단순히 스위프트가 자동으로 달성하기 위해 문자열 함수의 수보다 큰 사용할 것을 추론 할 수있다,보다 큼 기호를 전달할 수 있습니다 :

    import Cocoa
    
    let names = ["AT", "AE", "D", "S", "BE"]
    
    var reversed = names.sort(>)
    print(reversed)
    

    위의 프로그램 실행 출력은 다음과 같습니다

    ["S", "D", "BE", "AT", "AE"]
    

    후행 폐쇄

    폐쇄 후행하는 마지막 매개 변수로의 호출을 지원하기 위해 식, 함수의 폐쇄 후 괄호로 작성된 기능입니다.

    func someFunctionThatTakesAClosure(closure: () -> Void) {
        // 函数体部分
    }
    
    // 以下是不使用尾随闭包进行函数调用
    someFunctionThatTakesAClosure({
        // 闭包主体部分
    })
    
    // 以下是使用尾随闭包进行函数调用
    someFunctionThatTakesAClosure() {
      // 闭包主体部分
    }
    

    import Cocoa
    
    let names = ["AT", "AE", "D", "S", "BE"]
    
    //尾随闭包
    var reversed = names.sort() { $0 > $1 }
    print(reversed)
    

    정렬 () {$ 0>을 $ 1} 후행 폐쇄 후.

    위의 프로그램 실행 출력은 다음과 같습니다

    ["S", "D", "BE", "AT", "AE"]
    

    참고 : 폐쇄 후행 사용하는 기능을 하나의 매개 변수 표현 폐쇄가, 당신도 넣을 수있는 경우 () 생략.

    reversed = names.sort { $0 > $1 }
    

    캡처 된 값

    클로저는 정의의 맥락에서 상수 또는 변수를 캡처 할 수 있습니다.

    이들 상수없는 원래 도메인 변수에도 정의는 폐쇄 여전히 생체 폐쇄 참조 이들 값의 변경으로 기능 할 수있다.

    폐쇄 스위프트 쉬운 형태의 함수는 함수의 다른 함수 본문에 정의되는 함수 중첩된다.

    중첩 된 함수는 외부 함수의 매개 변수와 정의 된 상수와 변수를 모두 캡처 할 수 있습니다.

    이 예를 보면 :

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

    함수의 makeIncrementor, 그것은 int 형 amout의 매개 변수를 가지고 있으며, 외부 매개 변수 이름 forIncremet이 당신이 호출 할 때, 당신은 외부 이름을 사용해야한다는 것을 의미합니다. 리턴 값은이다 ()-> Int 함수.

    표제 함수에서 변수와 함수의 RunningTotal은 증 분기를 선언.

    증 분기 함수 인수를 얻을 수 없지만,이 함수 본문에 RunningTotal은 양 및 변수를 액세스하기. 그것은 기존 RunningTotal은 실현 가변 량을 캡처하여 함수 본문을 포함하기 때문이다.

    어떠한 변경 량 변수가 없기 때문에, 증 분기 실제로 캡처 증 분기 등의 사본과 함께 저장되는 변수의 복사본을 저장한다.

    그래서 우리는 호출이 함수는 누적됩니다

    import Cocoa
    
    func makeIncrementor(forIncrement amount: Int) -> () -> Int {
        var runningTotal = 0
        func incrementor() -> Int {
            runningTotal += amount
            return runningTotal
        }
        return incrementor
    }
    
    let incrementByTen = makeIncrementor(forIncrement: 10)
    
    // 返回的值为10
    print(incrementByTen())
    
    // 返回的值为20
    print(incrementByTen())
    
    // 返回的值为30
    print(incrementByTen())
    

    위의 프로그램 실행 출력은 다음과 같습니다

    10
    20
    30
    

    클로저는 참조 형식입니다

    위의 예는, incrementByTen은 일정하지만, 이러한 상수의 폐쇄 시점은 여전히 ​​변수 캡처의 가치를 높일 수 있습니다.

    함수와 클로저가 참조 형식이기 때문이다.

    당신은 상수 또는 변수에 할당 된 기능 / 폐쇄 여부, 당신은 실제로 상수 / 변수 해당 기능 / 폐쇄 참조의 값을 설정합니다. 위의 예는, incrementByTen 기준점 오히려 폐쇄 자체의 내용보다는 상수 클로저.

    이것은 또한 당신이 두 개의 서로 다른 상수 / 변수의 폐쇄를 할당하는 경우, 두 값이 같은 폐쇄를 가리키는 것을 의미한다 :

    import Cocoa
    
    func makeIncrementor(forIncrement amount: Int) -> () -> Int {
        var runningTotal = 0
        func incrementor() -> Int {
            runningTotal += amount
            return runningTotal
        }
        return incrementor
    }
    
    let incrementByTen = makeIncrementor(forIncrement: 10)
    
    // 返回的值为10
    incrementByTen()
    
    // 返回的值为20
    incrementByTen()
    
    // 返回的值为30
    incrementByTen()
    
    // 返回的值为40
    incrementByTen()
    
    let alsoIncrementByTen = incrementByTen
    
    // 返回的值也为50
    print(alsoIncrementByTen())
    

    위의 프로그램 실행 출력은 다음과 같습니다

    50