반응형
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
- UIButton
- userdefaults
- uikit
- Remot Push
- WWDC16
- OperationQueue
- ios
- 동시성프로그래밍
- 후행 클로저
- property wrapper
- SWiFT
- entrypoint
- viewcontroller
- firebase
- weak
- TableView
- AppTransportSecurity
- 트레일링 클로저
- IBOutlet
- IBOutletCollection
- RunLoop
- DispatchQueue
- 원격 푸시
- tableViewCell
- CoreLocation
- for-in
- 진입점
- Understanding Swift Performance
- 연산 프로퍼티
- Choosing Between Structures and Classes
Archives
- Today
- Total
iOS 공부하는 감자
Day6) 함수, 파라미터, 클로저 본문
반응형
함수
- func 키워드를 사용하여 함수를 정의할 수 있다.
- 스위프트에서의 함수는 재정의(오버라이드), 중복 정의(오버로드)를 모두 지원한다.
- 스위프트에서 함수는 일급 객체로, 함수를 변수나 상수에 할당 가능하고 매개변수를 통해 전달도 가능하다.
- 매개변수(=parameter) : 함수를 정의할 때 외부로부터 받아들이는 전달 값의 이름 (=parameter)
- 전달인자(=argument) : 실제로 함수를 실행할 때 전달하는 값
- 전달인자 레이블 : 함수 외부에서 매개변수의 역할을 좀 더 명확하게 할 수 있다.
-
func addNumber(a: Int, b: Int) -> Int { return a + b } print(addNumber(a: 3, b: 5)) // 8
매개변수 기본값
- 스위프트의 함수에서는 매개변수마다 기본값을 지정할 수 있다.
- 함수를 호출할 때 매개변수가 전달되지 않으면 기본값을 사용한다.
-
func sayHo(times: Int = 3) { for _ in 1...times { print("Ho!!") } } sayHo() // 매개변수를 전달해주지 않아서 기본값만큼 3번 출력 sayHo(times: 1) // 매개변수로 넘겨준 숫자만큼 출력
가변 매개변수
- 매개변수로 몇 개의 값이 들어올지 확실하지 않을 때 사용한다.
- 가변 매개변수는 0개 이상의 값을 받아올 수 있으며 들어온 인자 값은 함수 내부에서 배열처럼 사용한다.
-
// ...키워드로 가변 매개변수임을 나타냄 func printPresents(presents: String...) { for present in presents { print(present) } } printPresents(presents: "iMac", "iPhone", "Macbook Pro") //iMac //iPhone //Macbook Pro
매개변수로 다수의 값을 받을 때 가변 매개변수와 배열 매개변수의 차이점 기본값을 가질 수 없음 기본값을 가질 수 있음 함수의 매개변수가 적을 때 유용 함수의 매개변수가 많을 때 유용 배열로 저장된 다른 변수, 상수를 매개변수로 받을 수 없음
입출력 매개변수
- 함수의 전달인자로 값을 전달할 때는 일반적으로 값을 복사해서 전달한다. (상수로)
- 값이 아닌 참조를 전달하고자 한다면 입출력 매개변수를 사용할 수 있다.
- 값 타입 데이터의 참조를 전달인자로 전달하면 함수 내부에서 해당 값을 참조하여 직접 값을 변경할 수 있다.
- 입출력 매개변수의 전달 순서
- 함수를 호출할 때 전달인자의 값을 복사
- 해당 전달인자의 값을 변경하면 1에서 복사한 것을 함수 내부에서 변경
- 함수를 반환하는 시점에 2에서 변경된 값을 원래의 매개변수에 할당
- 입출력 매개변수로 설정할 매개변수의 타입 앞에 inout 키워드를 추가해서 표현
-
var someInt: Int = 0 print(someInt) // 0 func addFive(number: inout Int) { number += 5 } addFive(number: &someInt) print(someInt) // 5
클로저
- 일정 기능을 수행하는 코드를 하나의 블록으로 모아놓은 것이다.
- 위에서 설명한 함수는 클로저의 한 형태 (Named Closure)
- 일반적으로 클로저라고 부르는 형태는 익명 함수(Unnamed Closure)를 의미한다.
- 함수와 마찬가지로 일급 객체이다.
- 클로저(익명함수)에서는 전달인자(Argument Label)를 사용하지 않는다.
-
// 익명함수이므로 func 키워드를 사용하지 않는다. { (Parameter) -> ReturnType in 실행구문 }
후행 클로저
- 함수나 메서드의 마지막 매개변수가 클로저일 때 클로저 문법을 함수 뒤에 붙여서 작성하는 방법
- 후행클로저를 사용하면 전달인자는 생략된다.
let someIntArray: [Int] = [1, 2, 3, 4, 5, 6] let reversed: [Int] = someIntArray.sorted() { (first: Int, second: Int) -> Bool in return first > second } print(reversed) // [6, 5, 4, 3, 2, 1]
클로저 표현 간소화
- 함수나 메서드의 전달인자로 전달되는 클로저는 메서드에서 요구하는 형태로 전달해야 한다. ex) (Int, Int) -> Bool ..
- 전달인자로 전달할 클로저는 이미 적합한 타입을 준수하고 있다고 유추할 수 있다.
- 따라서 전달인자로 전달하는 클로저는 매개변수의 타입이나 반환값의 타입을 명시하지 않고 생략할 수 있다.
- 단축 인자이름 : 클로저의 매개변수 이름이 굳이 필요하지 않다면 단축 인자이름을 사용 가능하다. ($0, $1....)
-
// a, b라는 정수형과 (Int, Int) -> Int 형태를 가지는 클로저를 매개변수로 받는 함수 func calculate(a: Int, b: Int, method: (Int, Int) -> Int) -> Int { return method(a, b) } // 클로저 문법을 작성할 때 (Int, Int) -> Int in 부분이 생략되었다. var result: Int = calculate(a: 3, b: 3, method: { return $0 + $1 }) print(result) // 6
- 암시적 반환 표현 : 클로저에 반환값이 있고, 클로저의 내부 구문이 단일 리턴문인 경우 return 키워드를 생략 가능하다.
- 위 코드에서 return 키워드를 생략해도 잘 작동한다.
-
// a, b라는 정수형과 (Int, Int) -> Int 형태를 가지는 클로저를 매개변수로 받는 함수 func calculate(a: Int, b: Int, method: (Int, Int) -> Int) -> Int { return method(a, b) } // 클로저 문법을 작성할 때 (Int, Int) -> Int in 부분이 생략되었다. var result: Int = calculate(a: 3, b: 3, method: { $0 + $1 }) print(result) // 6
반응형
'22 베이직 챌린지' 카테고리의 다른 글
Day8) 프로퍼티, 연산 프로퍼티 (0) | 2022.01.10 |
---|---|
Day7) 클래스와 구조체 (0) | 2022.01.09 |
Day5) 연산자, 조건문, 반복문 + 알고리즘 (0) | 2022.01.07 |
Day4) 연산자, 조건문, 반복문 + 알고리즘 (0) | 2022.01.06 |
Day3) 배열, 딕셔너리, 세트, 열거형 + 알고리즘 (0) | 2022.01.05 |