클로저
클로저?
이름이 없는 함수!
잠깐만 쓰다가 버릴! 함수!!
이름을 원하는대로 바꿀 수 있다.
{ 매개변수 이름: 매개변수 타입 } → 반환타입 in
클로저 표현식 코드
//voide의 리턴
let test = { () -> () in //input Void (), output Void () 갖는다.
print("test")
test() //출력: test
@escaping
더 큰 함수가 종료되면 내부의 작은 함수들도 같이 종료되는데,
escaping을 사용하면 큰 함수 밖에서 사용 가능
클로저가 함수 밖에서도 사용할 수 있게 해주는 기능이다!
캡쳐
클로저는 값을 캡쳐할 때 value, reference 타입 관계 없이
모두 reference 타입으로 캡쳐한다!
즉, 클로저 외부에 있는 변수의 변경을 클로저 내부에서 할 수 있다!
=클로저 내부값을 조정하면 외부 변수 변경할 수 있다.
고차함수
//ex) 타입의 변경
let stringArray = ["1", "2", "3"]
numberArray = strignArray.map {
if let changeToInt = Int($0) //조건 순회
return changeToInt
}
return 0
}
print(numberArray)
// [1, 2, 3, 0]
// for 문으로 구현
// numbers에서 짝수만 추출하기
let numbers1 = [1, 2, 3, 4, 5, 6, 7, 8, 9]
var evenNumbers1: [Int] = []
for number in numbers1 {
if number % 2 == 0 {
evenNumbers1.append(number)
}
}
print(evenNumbers1) // [2, 4, 6, 8]
// filter로 구현
// numbers에서 짝수만 추출하기
let numbers2 = [1, 2, 3, 4, 5, 6, 7, 8, 9]
let evenNumbers2 = numbers2.filter { n in
if n%2 == 0 {
return true // 포함
} else {
return false // 포함x (걸러짐)
}
}
print(evenNumbers2)
let evenNumbers3 = numbers2.filter { $0 % 2 == 0 }
print(evenNumbers3) // [2, 4, 6, 8]
let bigNumber = numbers2.filter { $0 > 7 }
print(bigNumber) // [8, 9]
protocol 프로토콜