일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- rxswift
- Refactoring
- 리팩토링
- map
- swiftUI
- Xcode
- 애니메이션
- MVVM
- 스위프트
- ios
- HIG
- clean architecture
- UICollectionView
- swift documentation
- 리펙토링
- SWIFT
- tableView
- Clean Code
- Observable
- ribs
- 클린 코드
- UITextView
- collectionview
- combine
- RxCocoa
- uiscrollview
- Protocol
- Human interface guide
- uitableview
- 리펙터링
- Today
- Total
김종권의 iOS 앱 개발 알아가기
[swift] 6. 함수(일급 함수) 본문
1. 함수
- 인자레이블 : 매개변수 이름
1
2
3
4
5
6
7
8
9
10
|
func myFunc(myValue: Int, myValue2: Int) -> (String, Int) {
var ret : (String, Int) = (String(myValue + myValue2)!, myValue1)
return ret
}
// myValue, myValue2가 인수레이블
myFunc(myValue: 123, myValue2: 13) // 함수호출방법 1
myFunc(myValue:myValue2:)(123, 13) //함수호출방법 2
|
- 위에서 함수 이름은, myFunc(myValue:myValue2)
- defer 블록 : 함수안에서 return을 만나기 전에 defer블록을 만나게 되면, return 종료 전에 defer블록을 역순(가장 최근에 만난 defer블록)부터 실행한 후 종료되는 것
(코드상 끝(밑)에있는 defer블록먼저 실행)
(중첩 defer블록인 경우는 내부 defer블록먼저 실행 후 외부 defer블록 실행)
1) typealias
- c에서의 typedef
1
2
3
4
5
6
7
8
9
10
|
typealias myDataType = (String, Int)
func myFunc(myValue: Int, myValue2: Int) -> myDataType {
var ret : (String, Int) = (String(myValue + myValue2)!, myValue1)
return ret
}
let value = myFunc(myValue: 1, myValue2: 2)
value.0
value.1
|
2) 외부 매개변수, 내부 매개변수
1
2
3
4
5
6
7
8
|
func myFunc(one v1: Int, two v2: Int, _ v3: Int) -> () {
print(v1) // 함수 내부 : 내부 매개변수로
print(v2)
print(v3)
return
}
myFunc(one: 1, two: 2, 3) // 함수 외부 : 외부 매개변수로
|
* 외부 매개변수가 '언더바'이면 접근 시, 이름 없이 바로 인수로 넣어주기 가능
3) 가변인자
1
2
3
4
5
6
7
8
9
|
func myFunc(one v1: Int...) -> () {
for n in v1 {
print(n)
}
return
}
myFunc(one: [1, 2, 3, 4])
|
4) 매개변수의 수정
- 방법1 : 매개변수는 상수로 지정되어 있으므로, var로 새로 선언하여 대입
- 방법2 : inout을 자료형 앞에 선언
1
2
3
4
5
6
7
8
9
10
11
12
|
// var로 새로 선언
func myFunc(one v1: Int) -> Int {
var v1 = v1
return v1
}
// inout ( call by reference)
func myFunc(one v1: inout Int) -> () {
v1 += 1
}
var cnt = 1
myFunc(one: &cnt)
|
5) 일급 함수(first- class function)
- 프로그램언어 안에서 특정 종류의 함수가 일급의 지위를 가지는 개념
- 스위프트는 객체지향 언어이면서 동시에, 함수형 언어
(1) 변수나 상수에 함수를 대입 가능 ( 인수 레이블 생략 가능 )
1
2
3
4
5
6
7
8
9
10
11
12
13
|
func myFunc(one v1: Int) -> () {
print(v1)
}
// 정석
let f: (Int) -> () = myFunc(one:)
// 생략 (권장- 오버로딩에 의한 타입 구별에 장점)
let f = myFunc(one:)
// 더 생략
let f = myFunc
f(123)
|
(2) 함수의 반환 타입에, 함수를 사용 가능
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
func firstFun(v1: Int) -> (String) -> () {
print(v1)
return secondFun
}
func secondFun(v2: String) -> () {
print(v2)
}
//
let f = firstFun(1)
f("abc")
//
firstFun(1)("abc")
|
(3) 함수의 인자값으로 함수를 사용할 수 있음
1
2
3
4
5
6
7
8
9
|
func decre(v: Int) -> Int {
return v-1
}
func broker(param: Int, myFunc f: (Int) -> Int ) -> Int {
return f(param)
}
broker(param: 123, myFunc: decre)
|
2. 함수의 중첩
- 내부 함수의 생명주기 : 외부 함수가 종료되면 내부 함수는 사라짐(함수의 은닉성)
단, 참조 변수가 참조하고 있을 땐, 사라지지 않음
, 내부 함수에서 외부 함수의 변수를 참조하고 있을 때 역시 외부 함수가 사라져도 변수는 존재 = "클로저"
, 지역변수의 값이 유지 -> 값이 "캡쳐" 되었다고 표현
1
2
3
4
5
6
7
8
9
10
11
|
func outer(param: Int) -> (Int) -> String {
let value = param + 1
func inner(v: Int) -> String {
return "\(v + value) val"
return inner
}
let f1 = outer(param: 3) // outer함수가 생성된 후 inner함수를 만들고 삭제됨. (그래도 inner함수는 존재)
let f2 = f1(30) // 31 (외부 함수에 있던 변수가, 외부 함수가 사라져도 계속 남아있음)
|
- 클로저 = 내부함수 + 함수의 주변환경 (객체)
※ 스위프트에서의 클로저는 더 넓은 의미
'swift 5 문법' 카테고리의 다른 글
[swift] 8. 구조체(struct)와 클래스(class), 프로퍼티 (0) | 2020.03.27 |
---|---|
[swift] 7. 클로저(closure) (0) | 2020.03.26 |
[swift] 5. 옵셔널(Optional) (0) | 2020.03.26 |
[swift] 4. 배열(Array), 집합(Set), 튜플(Tuple), 딕셔너리(Dictionary) (0) | 2020.03.25 |
[swift] 3. 반복문 및 제어문 (0) | 2020.03.25 |