Swift / Welcome to Swift(4)

Minsang Kang·2022년 2월 13일
0

Swift

목록 보기
4/5
post-thumbnail

The Swift Programming Language 도서 내용을 토대로 번역 및 요약된 내용입니다.

A Swift Tour

Functions and Closures

func 통해 함수를 선언할 수 있다.
괄호 및 파라미터들과 함수의 반환 type 값은 -> 키워드로 구별된다.

func greet(person: String, day: String) -> String { // 함수 greet 생성, 반환 type: String
    return "Hello \(person), today is \(day)."
}
greet(person: "Bob", day: "Tuesday")

일반적으로 매개변수명파라미터명을 따르나, 파라미터명 앞에 따로 명시할 수 있다.
또한 _ 키워드를 매개변수명으로 사용하여 생략하여 사용할 수 있다.

func greet(_ person: String, on day: String) -> String { // 파라미터명 앞에 매개변수명 명시
    return "Hello \(person), today is \(day)." // 함수 내에선 파라미터명 사용
}
greet("John", on: "Wednesday") // 함수 사용시엔 매개변수명 사용

tuple type을 통해 multiple value 값을 지닌 타입을 만들어 함수에서 여러 값들을 반환시 사용할 수 있다.
tuple 의 요소들은 숫자 또는 이름을 통해 접근할 수 있다.

func calculateStatistics(scores: [Int]) -> (min: Int, max: Int, sum: Int) { // 반환갑: tuple
    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) // tuple 을 통해 여러변수값들 반환
}
let statistics = calculateStatistics(scores: [5, 3, 100, 3, 9])
print(statistics.sum) // 이름을 통해 요소 접근
// Prints "120"
print(statistics.2) // 숫자를 통해 요소 접근
// Prints "120"

함수는 특정함수 내 함수로써 nested function 이 될 수 있으며, outer 함수의 변수들을 접근할 수 있다.

func returnFifteen() -> Int {
    var y = 10
    func add() { // nested function, outer function 의 변수인 y 접근 가능
        y += 5
    }
    add()
    return y
}
returnFifteen()

함수는 first-class type 이므로 반환값이 될 수 있다.
또한 매개변수로 사용될 수 있다.

func makeIncrementer() -> ((Int) -> Int) { // 반환타입: func
    func addOne(number: Int) -> Int {
        return 1 + number
    }
    return addOne // func 반환
}
var increment = makeIncrementer()
increment(7)
func hasAnyMatches(list: [Int], condition: (Int) -> Bool) -> Bool { // condition: 함수
    for item in list {
        if condition(item) { // 함수 내에서 매개변수로 받은 함수를 사용
            return true
        }
    }
    return false
}
func lessThanTen(number: Int) -> Bool {
    return number < 10
}
var numbers = [20, 19, 7, 12]
hasAnyMatches(list: numbers, condition: lessThanTen) // 함수의 매개변수로 함수 사용

함수는 실제로 closure 의 특별케이스 로, 나중에 호출할 수 있는 blocks of code 이다.
closure의 코드는 closure가 실행될 때 다른 범위에 있더라도 closure가 생성된 범위에서 사용할 수 있었던 변수와 함수와 같은 것에 접근할 수 있다. (ex: nested function)
또한 함수명 없이 ({}) 형식을 통해 이름없는 closure를 작성할 수 있다.
in 키워드를 통해 함수의 함수의 반환 type 과 분리된다.

numbers.map({ (number: Int) -> Int in // param, return type 명시된 closure
    let result = 3 * number
    return result
})

closure 를 보다 간결하게 사용할 수 있습니다.
closure 의 parameter 들, 또는 return type 또는 둘다 type 을 이미 알고있다면 생략 할 수 있다.

let mappedNumbers = numbers.map({ number in 3 * number }) // param: Int, return: Int 알 수 있으므로 둘다 생략된 closure
print(mappedNumbers)
// Prints "[60, 57, 21, 36]"

또한 parameter 들을 이름 대신 $숫자 형식으로 사용할 수 있다.

let mappedNumbers = numbers.map({ 3 * $0 }) // $0을 통해 parameter 명 생략된 closure
print(mappedNumbers)
// Prints "[60, 57, 21, 36]"

함수에 대한 마지막 매개변수로 전달된 클로저는 괄호 바로 뒤에 나타날 수 있습니다.

let mappedNumbers = numbers.map() { number in 3 * number }
print(mappedNumbers)
// Prints "[60, 57, 21, 36]"

closure 가 함수의 유일한 매개변수일 때, 괄호를 완전히 생략할 수 있습니다.

let sortedNumbers = numbers.sorted { $0 > $1 } // 유일한 매개변수이기에 괄호 생략된 closure
print(sortedNumbers)
// Prints "[20, 19, 12, 7]"

Reference

다음에서 발췌
docs.swift.org
The Swift Programming Language (Swift 5.5) Apple Inc.
이 자료는 저작권에 의해 보호됩니다.

profile
 iOS Developer

0개의 댓글