- Today
- Total
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Python
- 딥러닝
- rxswift
- HTTP
- Request
- r
- ios
- scheduledTimer
- Observable
- ReLU
- barplot
- rest api
- decode
- sigmoid
- 티스토리챌린지
- struct
- substr
- tapply
- Linux
- 오블완
- MVC
- cocoapods
- Optional
- 시각화
- swiftUI
- 명령어
- deeplearning
- 연산자
- SQL
- SWIFT
iOS 개발 기록 블로그
iOS (Swift) Closure 의 개념과 사용 방법 본문
일반적인 함수의 형태는 아래와 같다.
func functionName (param1: dataType, param2: dataType) -> dataType { return output } |
특정 데이터가 입력되어 함수를 통과하면
데이터가 출력된다.
이 입력된 데이터들을 또 다른 함수를 통과하도록 할 수 있다.
import UIKit import Foundation func calculator(n1: Int, n2: Int, operation: (Int, Int) -> Int) -> Int{ return operation(n1, n2) } func add(n1: Int, n2: Int) -> Int{ return n1 + n2 } print(calculator(n1: 2, n2: 3, operation: add(n1:n2:))) //결과: 5 |
Closure는 함수명을 지우고 중괄호( { )를 제일 앞으로 옮기고
그 자리에 in을 써주고 그대로 써준다.
말로는 설명이 힘드니 코드를 바로 보자.
import UIKit import. Foundation func calculator(n1: Int, n2: Int, operation: (Int, Int) -> Int) -> Int{ return operation(n1, n2) } func add(n1: Int, n2: Int) -> Int{ return n1 + n2 } calculator(n1: 2, n2: 3, operation: { (n1: Int, n2: Int) -> Intin return n1 * n2 }) //결과: 6 |
위 코드의 마지막 줄을 더 줄일 수도 있다.
calculator(n1: 2, n2: 3, operation: { (n1, n2) in n1 * n2 })
컴파일 시에 스위프트는 n1과 n2 그리고 output 데이터 타입까지
추론할 수 있다.
심지어 뒷부분의 n1과 n2까지도 생략할 수 있다.
import UIKit import Foundation func calculator(n1: Int, n2: Int, operation: (Int, Int) -> Int) -> Int{ return operation(n1, n2) } func add(n1: Int, n2: Int) -> Int{ return n1 + n2 } let result = calculator(n1: 2, n2: 3, operation: { $0 * $1 }) print(result) // 결과: 6 |
이렇게 똑같이 잘 동작한다.
마지막으로 더 생략할 수 있다.
let result= calculator(n1: 2, n2: 3) { $0 * $1 }
이렇게 해도 똑같이 동작한다.
이렇게 { 받은 변수 + 수식 } 으로 쓸 수도 있다.
이를 Tailing Closure라고 한다.
이렇게 줄이는 코드를 좋다고 하는 개발자도 있지만
풀어서 함수를 만들고 그 함수를 갖다 쓰는게
해석하기에 더 좋은 코드라고 하는 개발자도 있다.
// 방법 1 let result= calculator(n1: 2, n2: 3) { $0 * $1 } print(result) // 방법 2 func multiply(no1: Int, no2: Int) -> Int{ return no1 * no2 } print(calculator(n1: 2, n2: 3, operation: multiply)) |
나는 개인적으로 방법 2가 좋은데
여러가지 다 알고 있어야 다른 사람의 코드를 해석할 수 있을 것 같다.
어떤 식으로 코딩할지는 프로그래머 마음이다.
Array에 적용해보기
let array= [6,2,3,9,4,1] func addOne(n1: Int) -> Int{ return n1 + 1 } array.map(addOne) // [7, 3, 4, 10, 5, 2] |
이렇게 map을 통해 배열의 모든 요소들에 1을 더해줄 수 있다.
이걸 클로저를 사용해서 줄여보자.
먼저 func addOne을 지워준다.
그 다음 오른쪽에 남아있는 { 를 제일 앞으로 옮겨준다.
{ (n1: Int) -> Int return n1 + 1 } |
그 다음 Int 오른쪽에 in 키워드를 추가해준다.
그리고 addOne 대신 써준다.
let array= [6,2,3,9,4,1] array.map({ (n1: Int) -> Intin return n1 + 1 }) |
입력값의 데이터 타입과
출력값의 데이터 타입도 생략한다.
let array= [6,2,3,9,4,1] array.map({ (n1) in return n1 + 1}) |
return 까지 생략 가능
let array= [6,2,3,9,4,1] array.map({ (n1) in n1 + 1 }) |
그리고 아예 다 지우고 인풋 파라미터를 받는 $ 기호를 사용하여
간결화한다.
let array= [6,2,3,9,4,1] array.map{$0 + 1} |
예시 코드
let array= [6,2,3,9,4,1] let addArray= array.map{$0 + 1} print(addArray) let newArray= array.map{"\($0)"} print(newArray) |
결과
Closure 표현 구문
참고
안젤라유 강의: https://www.udemy.com/course/ios-13-app-development-bootcamp/
'iOS' 카테고리의 다른 글
iOS (Swift) 리펙토링(Refactoring)과 Computed Properties 이해하기 (0) | 2022.06.25 |
---|---|
iOS (Swift) JSON 디코딩(Decoding) (0) | 2022.06.24 |
iOS (Swift) URL Session for Networking (0) | 2022.06.22 |
iOS (Swift) OpenWeather API 모바일 앱에서 요청하기 (0) | 2022.06.21 |
iOS (Swift) OpenWeather API 사용하는 법 (0) | 2022.06.20 |