BESS(Back-End Study Space)

swift - 5.문법(Functions and Closures) 본문

iOS DEV/swift

swift - 5.문법(Functions and Closures)

leeez 2020. 12. 20. 16:56

▶ DEV TOOL

- Xcode 12.3

 

1. Functions and Closures

// Functions and Closures
// func를 사용해서 함수를 선언
// arguments는 타입 지정
// -> 뒤에는 리턴 타입 명시
// 함수 사용 시에는 파라미터 이름을 명시한 후 작성해야 함!!!
func greeting(name: String, greet: String) -> String{
    return "Hello \(name), \(greet)"
}
print("\(greeting(name: "Lee", greet: "Nice to meet you"))")


// 단, arguments 작성 시, _ 를 사용하면 함수 호출 시에 인자 레이블을 명시하지 않음
func greeting2(_ name : String, _ greet : String) -> String{
    return "Hello \(name), \(greet)"
}
print("\(greeting2("Lee","Nice to meet you"))")


// 함수는 여러 개의 값을 반환할 수 있음 => tuple로 여러값을 묶어서 한번에 반환할 수 있음
// ** tuple : 값을 묶어주는 것으로 구조체나 클래스 같은 거보다 간편하게 값을 묶는 용도로 사용
func calculateStatistics(scores: [Int]) -> (min: Int, max: Int, sum : Int){
    var min = scores[0]
    var max = scores[0]
    var sum = 0
    
    for score in scores {
        if score > max{
            max = score
        } else if score < min {
            min = score
        }
        sum += score
    }
    return (min, max, sum)
}
let statistics = calculateStatistics(scores: [15,8,3,29,100])
print(statistics.sum) // .으로 리턴 튜플에서 원하는 값 접근 가능
print(statistics.max)
print(statistics.1) // 튜플 순서 0, 1, 2 순서로 1을 통해 max 접근 가능


// 함수는 여러 개의 가변인자(...)를 받을 수 있고, 가변인자(...)는 배열처럼 접근 가능함
// *** 가변인자 : 매번 함수에 들어가는 인수(argumetns)의 개수가 변하는 것
func sumOf(numbers : Int...) -> Int {
    var sum = 0
    print(numbers.count) // 배열처럼 사용 가능
    
    for number in numbers {
        sum += number
    }
    return sum
}
sumOf()
sumOf(numbers: 19, 21, 3)


// Nested funcion(중첩함수)
// 중첩함수는 바깥쪽 함수에서 변수처럼 사용이 가능함
func returnFifteen() -> Int{
    var y = 10
    
    func add() {
        y += 5
    }
    
    add()
    
    return y
}
returnFifteen()


// 함수를 리턴하고 함수를 변수로 담는 예제
// -> ((Int) -> Int)
// Int를 파라미터로 받고 Int를 리턴하는 함수 타입을 리턴
func makeIncrementer() -> ((Int) -> Int){
    func addOne(_ number : Int) -> Int{
        return 1+number
    }
    
    // addOne 이라는 함수 자체를 리턴
    return addOne
}
// 리턴되는 함수를 변수에 받아서 실행 가능
var increment = makeIncrementer() //makeIncrementer()은 addOne()함수를 리턴하고, increment 변수는 addOne()함수를 받게 됨
increment(10) // 10이 addOne함수의 인자가 되어 결과가 나온다.


// 함수를 파라미터로 받는 예제
func hasAnyMatches(_ list: [Int], condition: (Int) -> Bool) -> Bool {

    for item in list {
        print("\(item)")
        if condition(item) {
            print("func out!")
            return true
        }
    }

    return false
}

func lessThanTen(_ number: Int) -> Bool {
    return number < 10
}

var numbers = [20, 19, 7, 12]
hasAnyMatches(numbers, condition: lessThanTen) // lessThanTen 함수 자체를 파라미터로 넘겨줌


// Closure : 코드 안에서 전달되어 사용할 수 있는 로직을 가진 중괄호"{}"로 구분된 코드의 블럭
// 전달인자, 변수, 상수 등으로 저장, 전달이 가능
// 함수는 클로저의 일종으로, 이름이 있는 클로저라고 생각하면 됨
let sum: (_ A: Int, _ B: Int) -> Int = { (a: Int, b: Int) in // sum이라는 상수에 클로저를 할당
    return a + b
}
let sumResult: Int = sum(1, 2)
print(sumResult) // 3

// 클로저 예제 2
func calculate(a: Int, b: Int, method: (Int, Int) -> Int) -> Int {
    return method(a, b)
}
var result : Int
// 방법 1
result = calculate(a: 10, b: 10, method: { (left: Int, right: Int) in
    return left + right
})
print(result) // 20

// 방법 2 (후행클로저)
result = calculate(a: 10, b: 10) { (left: Int, right: Int) in
    return left + right
}
print(result) // 20

// 방법 3 단축 인자 사용
result = calculate(a: 10, b: 10, method: {
    return $0 + $1
})
print(result) // 20

// 방법 4 단축 인자 사용하는 후행클로저
result = calculate(a: 10, b: 10) {
    return $0 + $1
}
print(result) // 20

// 방법 5 단축 인자 사용하는 후행클로저, 리턴 명시 생략 가능
result = calculate(a: 10, b: 10) { $0 + $1 }
print(result) // 20

 

 

 

 

 

'iOS DEV > swift' 카테고리의 다른 글

swift - 4.문법(반복문)  (0) 2020.12.16
swift - 3. 문법(조건문)  (0) 2020.12.16
swift - 2. 문법(변수,상수,배열,사전)  (0) 2020.12.15
swift - 1.시작  (0) 2020.12.15