스위프트 문법 - 함수 (Functions)

응애개발자·2023년 2월 10일
0

스위프트

목록 보기
8/8

정의와 호출

기본적인 정의방법

func 키워드뒤에

함수 이름 : exampleFunction
파라미터와 타입 : (exampleInt: Int)
반환형 : -> Int

으로 함수를 정의합니다.

func exampleFunction(exampleInt: Int) -> Int {
    return exampleInt
}

exampleFunction(exampleInt: 1)

파라미터가 없는 함수

func exampleFunction() -> Int {
	var exmapleNumber = 1
    return exampleNumber
}

복수의 파라미터를 사용하는 함수

func exampleFunction(int1: Int, int2: Int) -> result {
	var result = int1 + int2
    return result
}

반환 값이 없는 함수

리턴 자료형을 Void로 선언하거나 아예 안써도 된다.
또한 return뒤에 아무런 값을 쓰지 않는다면 return을 써도 에러가 없다.

func exampleFunction(int1: Int, int2: Int) -> Void {
	var result = int1 + int2
    print(result)
}

func secondExampleFunction(int1: Int, int2: Int) {
	var result = int1 + int2
    print(result)
}

func thirdExampleFunction(int1: Int, int2: Int) {
	var result = int1 + int2
    print(result)
    return
}

복수의 값을 반환하는 함수

값을 반환할 때 튜플을 이용하여 한번에 여러 값을 반환할 수 있다.
이또한 튜플로 반환하기 때문에 바인딩이 가능하고 값들의 타입에 구애받지 않을 수 있다.

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)
}

아래는 값을 튜플로 받아 min max를 이용해 값에 접근했다.

let bounds = minMax(array: [8, -6, 2, 109, 3, 71])
print("min is \(bounds.min) and max is \(bounds.max)")

파라미터 이름을 외부에서 다르게 사용하기(전달인자 레이블)

함수 선언시 파라미터명 앞에
함수 사용시에 쓸 임의의 이름을 입력하면
함수 호출시 앞서 입력한 그 임의의 이름으로 사용할 수 있다.
이것을 전달인자 레이블이라 한다.

func exampleFunction(name value1: String, from country: String) {
	//함수 내부 생략
}

exampleFunction(name: "Ju Yeon Lee", from: "Korea")

파라미터 이름 생략

스위프트는 함수 사용시에 파라미터명을 생략할 수 없지만 위의 방법을 응용하여 언더바(_)를 입력하여 파라미터명을 생략할 수 있다.

func exampleFunction(_ value1: String, _ country: String) {
	//함수 내부 생략
}

exampleFunction("Ju Yeon Lee", "Korea")

인자의 기본값 설정

함수 선언시 (파라미터명: 자료형 = 기본값) 형태로 기본값을 선언할 수 있다.

func example(parameter: Int = 7) {
	var result = parameter + 3
    print(result)
}
example()

//10 출력됨

가변 파라미터

인자의 자료형뒤에 공백없이 바로 "..."을 입력하면 가변적으로 입력 받을 수 있다.
전달받을 매개변수의 개수를 알기 어려울때 사용할 수 있다.

func addAllNumbers (_ numbers: Int...) -> Int {
    var temp = 0
    for a in numbers {
        temp += a
    }
    return temp
}

print(addAllNumbers(1,2,3,4,5))//15

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

여태까지는 함수를 값에 의한 호출(call by value)방식으로 썼다면 인아웃 파라미터는 참조에 의한 호출(call by reference)방식으로 씁니다.
때문에 함수의 호출 시 파라미터의 인자를 &를 넣어주어 값의 주소를 보내야 합니다.
또한 참조에 의한 호출로 인해 함수 외부에서 쓰며 함수의 호출시에 사용한 값이 실제로 영향을 받게됩니다.

인아웃 파라미터는 기본값을 가질 수 없고, 가변 파라미터는 인아웃 파라미터로 선언할 수 없습니다.

func swapvalue(_ a: inout Int, _ b: inout Int) {
    var temp = a
    a = b
    b = temp
}

var value1 = 2
var value2 = 6

swapvalue(&value1, &value2)

print(value1, value2)

함수 형(Function Types)

함수를 변수로 정의해서 사용할 수 있습니다.

func addTwoInts(_ a: Int, _ b: Int) -> {
	return a + b
}

var numbersum: (Int, Int) -> Int = addTwoInts

print("Result : \(numbersum(2,4))")

함수형을 명시적으로 선언하지 않아도 Swift에서 자체적으로 타입을 추론해 자동으로 함수를 할당할 수도 있다.

var numberSumVer2 = addTwoInts

기타

스위프트는 다른 언어와 달리 받은 값을 기본적으로 상수로 선언합니다. 따라서 값의 수정을 원할 경우 추가적인 작업을 해줘야 합니다.

func exampleFunction(exampleInt: Int) -> Int {
	var exampleInt = exampleInt
    return exampleInt
}

0개의 댓글