관리 메뉴

김종권의 iOS 앱 개발 알아가기

[swift] 6. 함수(일급 함수) 본문

swift 5 문법

[swift] 6. 함수(일급 함수)

jake-kim 2020. 3. 26. 15:43

1. 함수

 - 인자레이블 : 매개변수 이름

1
2
3
4
5
6
7
8
9
10
func myFunc(myValue: Int, myValue2: Int-> (StringInt) {
    var ret : (StringInt= (String(myValue + myValue2)!, myValue1)
    return ret
}
 
// myValue, myValue2가 인수레이블
 
 
myFunc(myValue: 123, myValue2: 13// 함수호출방법 1 
myFunc(myValue:myValue2:)(12313//함수호출방법 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 = (StringInt)
 
func myFunc(myValue: Int, myValue2: Int-> myDataType {
    var ret : (StringInt= (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: 23// 함수 외부 : 외부 매개변수로
 

 * 외부 매개변수가 '언더바'이면 접근 시, 이름 없이 바로 인수로 넣어주기 가능

 

3) 가변인자

1
2
3
4
5
6
7
8
9
func myFunc(one v1: Int...) -> () {
    for n in v1 {
        print(n)
    }
    
    return
}
 
myFunc(one: [1234])
 

 

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 (외부 함수에 있던 변수가, 외부 함수가 사라져도 계속 남아있음)
 

- 클로저 = 내부함수 + 함수의 주변환경 (객체)

 

※ 스위프트에서의 클로저는 더 넓은 의미

Comments