Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 스파르타 코딩클럽 내일배움캠프
- 배열 만들기1
- 문자열 붙여서 출력하기
- 프로그래머스 n의 배수 고르기
- 프로그래머스 배열 만들기1
- 연산자
- 프로그래머스 주사위 게임1
- continue
- 조건에 맞게 수열 변경하기 3
- 프로그래머스
- 프로그래머스 암호 해독
- n번째 원소까지
- 스페인어
- ruby설치
- cocoapods 설치 오류
- array
- Til
- 프로그래머스 자동커밋
- Error installing cocoapods
- 스파르타코딩캠프
- 문자열 정렬하기 (1)
- swift
- 객체지향
- 프로그래머스 조건에 맞게 수열 변경하기 3
- 프로그래머스 문자열 붙여서 출력하기
- Break
- 주사위 게임1
- 프로그래머스 최댓값 만들기(2)
- 프로그래머스 n번째 원소까지
- 프로그래머스 문자열 정렬하기 (1)
Archives
- Today
- Total
dev._.note
[Swift] 클로저(Closure) 본문
클로저 (Closure)
클로저는 사용자의 코드 안에서 전달되어 사용할 수 있는 로직을 가진 중괄호"{}" 구분된 코드의 블럭. 쉽게 말하면 클로저는 이름이 없는 함수. 따라서 함수는 이름이 있는 클로저라고 할 수 있음. 클로저를 사용한다면 따로 함수를 만들어야 할 불편함 없이 즉석에서 함수를 만들 수 있음.
스위프트의 클로저와 같은 것들
- C, C++, Objective-C 의 block
- Java의 Lambda funtion
- C#의 Delegates
클로저의 표현
{ (매개변수 이름 : 매개변수 타입) -> 반환타입 in
클로저 표현식 코드
}
함수와 굉장히 비슷한 형태를 띄고 있으며 가장 큰 차이점은 이름이 유무임. 클로저에서는 함수처럼 이름이 없음. 인자들을 넣을 수 있고 반환타입까지 설정가능. 그리고 함수의 내용에 해당하는 수행 내용을 in 다음에 작성.
함수
func add(x:Int, y:Int) -> Int {
return (x+y)
}
print(add(x:10, y:20))
두개의 인자를 받으며 두 인자의 합을 반환.
클로저
let add1 = {(x:Int, y:Int) -> Int in
return(x+y)
}
print(add1(10,20))
위의 일반적인 함수와 기능은 똑같지만 클로저로 표현. add 상수에 함수를 넣어주는 느낌으로 표현.
후행 클로저 (trailing closure)
후행 클로저란 클로저가 함수의 마지막 argument라면 마지막 매개변수 이름을 생략한 후 함수 소괄호 외부에 클로저를 구현할 수 있게 해주는 것임. 클로저에 여러 줄 표현(실행 코드)가 들어가게 된다면 가독성을 위해 사용하는 것이 좋음.
//후행 클로저 미사용
let onAction = UIAlertAction(title: "On", style: UIAlertAction.Style.default, handler: {
//실행 코드
})
//후행 클로저 사용
let onAction = UIAlertAction(title: "On", style: UIAlertAction.Style.default) {
//실행 코드
})
첫번째 코드는 후행 클로저를 사용하지 않은 코드. UIAlertAction에 인자가 3개가 있고 마지막 매개변수의 이름을 생략하고 후행 클로저를 사용가능.
클로저의 축약 표현들
배열을 정렬해주는 클로저.
let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]
let reversed = names.sorted(by: { (s1: String, s2: String) -> Bool in
return s1 > s2
})
print(reversed)
- 타입 생략
클로저는 메서드에서 요구하는 형태로 전달해야 함. 그래야 이러한 문맥을 이용해 타입을 유추할 수 있음. 그래서 매개변수의 타입이나 반환 타입을 생략해서 클로저를 사용할 수 있게 됨.
let reversed = names.sorted(by: { (s1, s2) in
return s1 > s2
})
print(reversed)
- return 생략
클로저에서는 return도 생략가능.
let reversed = names.sorted(by: { (s1, s2) in
s1 > s2
})
print(reversed)
- 매개변수 생략
클로저에서는 매개변수의 이름도 생략가능. 매개변수의 이름을 명시하지 않아도 $와 숫자의 조합으로 단축 인자 이름을 사용할 수 있음. $0이 첫번째 매개변수가 되고 $2는 두번째 매개변수가 됩니다. 'in' 키워드도 생략가능.
let reversed = names.sorted(by: {
return $0 > $1
})
print(reversed)
- 연산자만 표기
클로저는 매개변수의 타입과 반환 타입이 연산자를 구현한 함수의 모양과 동일하다면, 연산자만 표기하더라도 알아서 연산하고 반환.
let reversed = names.sorted(by: >)
print(reversed)
'Dev > SWIFT' 카테고리의 다른 글
[Swift] ARC(Automatic Reference Counting) (0) | 2023.12.12 |
---|---|
[Swift] 예외처리 (0) | 2023.12.11 |
[Swift] Guard문 (0) | 2023.12.08 |
[Swift] 키오스크 과제 (1) | 2023.12.07 |
[Swift] 접근 제한자 (0) | 2023.12.06 |