STUDY/Swift

Swift 함수의 가변 매개변수, 입출력 매개변수

The Simpler 2018. 6. 29. 17:04

가변 매개변수: 매개변수로 몇 개의 값이 들어올지 모를 때!



import UIKit


// 가변 매개변수를 가지는 함수의 정의와 사용

func sayHelloToFriends(me: String, friends names: String...) -> String {

    

    let hello = "Hello! "

    var result = ""

    

    for friend in names {

        result += friend + ", "

    }

    

    return hello + result + "I'm \(me)"

}


print(sayHelloToFriends(me: "JB", friends: "CS", "SJ", "NJ", "SH", "YS"))


// 가변 매개변수기 때문에 없어도 문제가 없다.

print(sayHelloToFriends(me: "JB"))



입출력 매개변수: 일반적으로 함수의 전달인자로 값을 전달할 때에는 값을 복사해서 전달하지만, 값이 아닌 참조를 전달하려면 입출력 매개변수를 사용한다. 값 타입 데이터의 참조를 전달인자로 보내면 함수 내부에서 참조하여 원래 값을 변경한다. 이런 방식은 함수형 프로그래밍 패러다임에서는 지양하는 패턴이다. 물론 객체지향 프로그래밍 패러다임에서는 종종 사용된다. 애플의 프레임워크(iOS, macOS 등)에서는 객체지향 프로그래밍 패러다임을 사용(또한 프로토콜 지향 프로그래밍이기도 하다.) 하고 있으므로 유용할 수 있지만, 다른 환경에서는 사용하지 않는 것이 좋을 수도 있다. 



import UIKit


var numbers: [Int] = [1, 1, 1]


func nonReferenceParameter(_ arr: [Int]) {

    var copiedArr: [Int] = arr

    copiedArr[0] = 5

    // arr[0] = 5 // 값[constant]의 전달이기 때문에 변경할 수 없다며 오류가 뜬다.

}

nonReferenceParameter(numbers)

print(numbers[0]) // 그대로 1


func referenceParameter(_ arr: inout [Int]) {

    arr[0] = 5

}

referenceParameter(&numbers) // 참조를 표현하기 위해 &를 붙여준다.

print(numbers[0]) // 5로 바뀜