본문 바로가기
iOS/Swift

[Swift] Functions

by Jiseong 2021. 9. 23.

 

 

 

함수 (Functions)

 

정의와 호출 (Defining and Calling Functions)

 

정의 (Define)

func greet(person: String) -> String {
 let greeting = "Hello, " + person + "!"
 return greeting
}

// 문자열 직접 반환 가능
func greet(person: String) -> String {
 return "Hello, " + person + "!"
}

함수를 선언할 땐 맨 앞에 func 키워드를 붙이고 선언함수 이름을 정한 뒤, (person: String) 파라미터와 타입, 그리고 -> String 반환 타입을 정의한다.

 

호출 (Call)

print(greet(person: "Anna"))
// "Hello, Anna!"
print(greet(person: "Brian"))
// "Hello, Brian!"

정의된 함수에 인자값을 넣어 호출한다.

 

파라미터가 여러개거나 존재하지 않거나, 반환값이 여러개거나, 존재하지 않는 함수도 정의할 수 있다.

 

파라미터가 없는 함수

func sayHelloWorld() -> String {
    return "hello, world"
}
print(sayHelloWorld())
// "hello, world"

 

파라미터가 여러개인 함수

func greet(person: String, alreadyGreeted: Bool) -> String {
    if alreadyGreeted { // 이미 인사했으면
        return greetAgain(person: person) // 반환값에서 외부 함수 호출 가능
    } else { // 인사 안했으면
        return greet(person: person)
    }
}
print(greet(person: "Tim", alreadyGreeted: true))
// "Hello again, Tim!"

 

반환값이 없는 함수

func greet(person: String) {
    print("Hello, \(person)!")
}
greet(person: "Dave")
// "Hello, Dave!"

 

여러 값을 반환하는 함수

 

func minMax(array: [Int]) -> (min: Int, max: Int) { 
    var currentMin = array[0]
    var currentMax = array[0]
    for value in array[1..<array.count] {
        if value < currentMin {
            currentMin = value
        } else if value > currentMax {
            currentMax = value
        }
    }
    return (currentMin, currentMax)
}

튜플을 반환할 수 있다.

 

옵셔널 튜플 반환형

func minMax(array: [Int]) -> (min: Int, max: Int)? {
    if array.isEmpty { return nil }
    var currentMin = array[0]
    var currentMax = array[0]
    for value in array[1..<array.count] {
        if value < currentMin {
            currentMin = value
        } else if value > currentMax {
            currentMax = value
        }
    }
    return (currentMin, currentMax)
}

 

반환값에 ? 을 붙여 옵셔널 값을 반환시킬 수 있다.

실제 반환값에 접근하기위해선 if let과 같은 옵셔널 체이닝을 사용하거나, 강제 언래핑으로 접근할 수 있다.

// 옵셔널 체이닝을 사용하여 실제값 접근
if let bounds = minMax(array: [8, -6, 2, 109, 3, 71]) {
    print("min is \(bounds.min) and max is \(bounds.max)")
}
// "min is -6 and max is 109"

 

내부 인자, 외부 인자

func greet(person: String, from hometown: String) -> String {
    return "Hello \(person)!  Glad you could visit from \(hometown)."
}
print(greet(person: "Bill", from: "Cupertino"))
// "Hello Bill!  Glad you could visit from Cupertino."
//from - 외부, hometown - 내부

파라미터 앞에 인자 라벨을 지정해 실제 함수 내부에서 해당 인자를 식별하기 위한 이름과 함수 호출시 사용하는 이름을 다르게 해서 사용할 수 있다.

 

인자 생략

func someFunction(_ firstParameterName: Int, secondParameterName: Int) {
}
someFunction(1, secondParameterName: 2)

파라미터 앞에 _를 붙여 함수 호출시 인자값을 생략할 수 있다.

 

 

파라미터 default값 지정

 

함수의 파라미터 값에 기본 값을 설정할 수 있다. 기본 값이 설정 되어 있는 파라미터는 함수 호출시 생략할 수 있으며, 기본 값을 사용하지 않는 파라미터를 앞에 위치 시켜야 함수를 의미있게 사용하기 쉽다.

 

func someFunction(parameterWithoutDefault: Int, parameterWithDefault: Int = 12) {

}
someFunction(parameterWithoutDefault: 3, parameterWithDefault: 6) // parameterWithDefault = 6
someFunction(parameterWithoutDefault: 4) // parameterWithDefault = 12

 

함수 호출시 두번째 인자를 생략하면 함수안에서 parameterWithDefault값은 12가 기본 값으로 사용된다.

 

인-아웃 파라미터 (In-Out Parameters)

 

인자 값을 직접 변경하는 파라미터이다.

선언을 위해 파라미터 앞에 inout 이라는 키워드를 사용한다.

func swapTwoInts(_ a: inout Int, _ b: inout Int) {
    let temporaryA = a
    a = b
    b = temporaryA
}

var someInt = 3
var anotherInt = 107
swapTwoInts(&someInt, &anotherInt)
print("someInt is now \(someInt), and anotherInt is now \(anotherInt)")
// "someInt is now 107, and anotherInt is now 3"

 

함수의 인자에 변수를 넣을때 & 키워드를 넣는다.

C를 안다면 inout파라미터는 포인터를 넣는곳이라 생각하면 편하다.

 

 

'iOS > Swift' 카테고리의 다른 글

Swift) Optional Binding  (0) 2022.02.10
[Swift] Closure  (0) 2021.09.24
M1 error running pod install  (0) 2021.09.20
text property  (0) 2021.09.10
IOS Application Lifecycle  (2) 2021.09.09

댓글