최고의 스위프트 폐쇄 튜토리얼 2024년, 이 튜토리얼에서는 식 폐쇄,매개 변수 이름의 약어,연산자 함수,후행 폐쇄,캡처 된 값,클로저는 참조 형식입니다,를 배울 수 있습니다.
폐쇄 (폐쇄)를 사용하거나, 코드의 파라미터 값으로 이용 될 코드의 기능 자체 포함 블록이다.
C 및 목표 - C 코드 블록 (블록) 및 익명의 기능은 매우 유사하다 다른 프로그래밍 언어에서 스위프트 폐쇄.
전역 함수와 중첩 된 기능은 실제로 특별한 폐쇄입니다.
형태의 폐쇄 :
전역 함수 | 중첩 된 기능 | 식 폐쇄 |
나는 이름을 가지고 있지만 모든 값을 캡처 할 수 없습니다. | 이 이름이 아니라 기능 폐쇄 내의 값을 포착. | 무명 폐쇄, 경량 구문을 사용하면 상황에 따라 값을 캡처 할 수 있습니다. |
스위프트 폐쇄 최적화 장소를 많이 가지고 :
다음은 수신 매개 변수를 정의하고 폐쇄 구문의 특정 유형을 반환합니다 :
{(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