iOS

[iOS] Swift5 Function, Method, Closure(스위프트5 함수, 메서드, 클로저)

구루싸 2020. 3. 23. 22:46
반응형
SMALL

전세계적으로 코로나19가 기승이네요...

다들 몸조리 잘하시고 마스크 착용과 손씻기 잊지마세요~

오늘의 학습 주제는 스위프트5의 함수와 메서드, 클로저입니다

함수(Function)는 특정 작업을 수행하기 위해

호출할 수 있도록 이름 붙여진 코드 블록을 말하고

메서드(Method)는 특정 클래스나 구조체 또는 열거형과 연관된 함수를 말합니다

메서드는 스위프트5의 클래스(Class)에 대해

학습할 때 또 언급될 것이기 때문에 여기서는 생략하겠습니다

func sayHello() {
    print("Hello")
}
func buildMessageFor1(name: String, count: Int) -> String {
    return "\(name), you are customer number \(count)"
}
func buildMessageFor2(_ name: String, _ count: Int) -> String {
    "\(name), you are customer number \(count)"
}
func buildMessageFor3(userName name: String, userCount count: Int) -> String {
    "\(name), you are customer number \(count)"
}
func buildMessageFor4(userName name: String = "GuruSa", userCount count: Int) -> String {
    "\(name), you are customer number \(count)"
}
sayHello()
print(buildMessageFor1(name: "GuruSa", count: 10))
print(buildMessageFor2("GuruSa", 10))
print(buildMessageFor3(userName: "GuruSa", userCount: 10))
print(buildMessageFor4(userCount: 10))

함수를 통해 전달되는 각각의 인자(argument)는

함수가 받도록 구성된 매개변수(parameter)와 일치해야합니다

위의 코드에서 sayHello() 함수는 매개변수를 받지 않고

아무런 값도 반환하지 않는 함수로 단순히 sayHello()로 호출합니다

buildMessage1~4는 모두 같은 출력을 하도록 합니다

함수들을 살펴보기 전에 매개변수를 살펴보면

지역 매개변수명(local parameter name)과 외부 매개변수명(external parameter name)이 있습니다

2번 함수에서는 _ 이 외부 매개변수명이고 name이 지역 매개변수명이 되겠습니다

외부 매개변수명을 _로 지정하면 호출시에 따로 매개변수 지정을 하지 않습니다

반면에 외부 매개변수를 userName이라 지정하면 반드시 외부 매개변수를 참조해야 합니다

또 4번 함수처럼 디폴트 매개변수를 선언할 수도 있네요~

func sizeConverter(_ length: Float) -> (yards: Float, centimeters: Float, meters: Float) {
    let yards = length * 0.0277778
    let centimeters = length * 2.54
    let meters = length * 0.0254
    
    return (yards, centimeters, meters)
}
let lengthTuple = sizeConverter(20)
print("Yards : \(lengthTuple.yards) Centimeters : \(lengthTuple.centimeters) Meters : \(lengthTuple.meters)")

func displayStrings(_ strings: String...) {
    for string in strings {
        print(string)
    }
}
displayStrings("one", "two", "three", "four")

스위프트5는 위의 코드와 같이 결과값들을 튜플로 래핑하여

여러 개의 결과값을 반환할 수도 있고

가변개수 매개변수(variadic parameter)를 사용할 수 있습니다

함수하면 빼놓을 수 없는 이야기는 역시 값의 변환 문제인데요

아래의 코드를 보면 스위프트5의 값 변환 모습을 알 수 있습니다

var myValue = 10
func doubleValue(_ value: Int) -> Int {
    var value = value
    value += value
    return value
}
func doubleValue2(_ value: inout Int) -> Int {
    value += value
    return value
}
print("Before function call myValue = \(myValue)")
print("doubleValue call returns \(doubleValue(myValue))")
print("After function call myValue = \(myValue)")
print("Before function call myValue = \(myValue)")
print("doubleValue call returns \(doubleValue2(&myValue))")
print("After function call myValue = \(myValue)")

doubleValue를 호출했을 때는 myValue의 값은 10 그대로이며

doubleValue2를 호출하면 myValue의 값은 20으로 변경됩니다

'inout' 키워드와 호출시에 '&'를 기억하세요!!

또 함수를 아래와 같이 상수에 할당해서 사용할 수 있습니다

func inchesToFeet(_ inches: Float) -> Float {
    return inches * 0.0833333
}
func inchesToYards(_ inches: Float) -> Float {
    return inches * 0.0277778
}
let toFeet = inchesToFeet
let toYards = inchesToYards
func outputConversion(_ converterFunc: (Float) -> Float, value: Float) {
    let result = converterFunc(value)
    print("Result of conversion is \(result)")
}
outputConversion(toYards, value: 10)
outputConversion(toFeet, value: 10)

func decideFunction(_ feet: Bool) -> (Float) -> Float {
    if feet {
        return toFeet
    } else {
        return toYards
    }
}
outputConversion(decideFunction(true), value: 10)

코드를 한 번 실행시켜보면서 이해해보세요!!

아래의 코드는 클로저(Closure)와 클로저 표현식(Closure expression)을 나타냅니다

//: Closure
let sayHello = { print("Hello") }
sayHello()
//: Closure expression
let multiply = {(_ val1: Int, _ val2: Int) -> Int in
    return val1 * val2
}
let result = multiply(10, 20)

func functionA() -> () -> Int {
    var counter = 0
    func functionB() -> Int {
        return counter + 10
    }
    return functionB
}
let myClosure = functionA()
print(myClosure())

클로저 표현식은 이름을 가지지 않고

함수는 이름을 가지는 클로저 표현식일 뿐입니다

클로저 표현식에서 'in' 키워드는 클로저 표현식 코드의 시작을 가리킵니다

이것으로 오늘의 학습을 마치도록 하겠습니다

그럼 이만-_-

반응형
LIST