greet(person:)
이라 불립니다. 이것을 수행하기 위해 person
이라 불리는 String
값인 하나의 파라미터와 그 사람의 인사말을 포함한 String
반환 타입을 정의합니다:func
키워드를 앞에 붙여 함수를 정의 합니다. 반환 활살표 ->
(하이픈 뒤에 오른쪽 방향 꺽쇄를 붙임) 뒤에 반환 타입의 이름을 붙여 함수의 반환 타입을 나타냅니다.greet(person: "Anna")
와 같이 person
인자 뒤에 String
값을 전달하여 greet(person:)
함수를 호출합니다. 함수는 String
값을 반환하므로 greet(person:)
은 위에서와 같이 반환 값의 문자열을 출력하기 위해 print(_:separator:terminator:)
함수로 래핑할 수 있습니다.NOTEprint(_:separator:terminator:)
함수는 첫번째 인자의 라벨을 가지고 있지 않고 다른 인자는 기본값을 가지고 있으므로 선택입니다. 함수 구문의 이러한 변형은 아래 함수 인자 라벨과 파라미터 이름 (Function Argument Labels and Parameter Names) 와 파라미터 기본값 (Default Parameter Values) 에서 자세히 설명합니다.
greet(person:)
함수의 바디는 greeting
으로 불리는 새로운 String
상수 정의와 간단한 인사말 메세지 설정으로 시작합니다. 이 인사말은 return
키워드를 사용하여 함수의 바깥으로 전달됩니다. return greeting
이라는 코드 줄에서 함수는 실행을 완료하고 인사말의 현재값을 반환합니다.greet(person:)
함수를 여러번 호출할 수 있습니다. 위의 예제에서 "Anna"
와 "Brian"
의 입력값으로 호출할 경우 어떤일이 생기는지 보여줍니다. 이 함수는 각 경우에 맞춰 인사말을 반환합니다.String
메세지를 반환하는 입력 파라미터가 없는 함수가 있습니다:person
이라 라벨을 가진 String
인자값과 alreadyGreeted
이라 라벨을 가진 Bool
인자값을 소괄호 안에 콤마로 구분하여 greet(person:alreadyGreeted:)
함수로 전달하여 호출합니다. 이전 섹션에서 본 greet(person:)
함수와는 다른 함수인 것을 명심해야 합니다. 두 함수 모두 greet
으로 시작하는 이름을 가지지만 greet(person:alreadyGreeted:)
함수는 2개의 인자를 가지지만 greet(person:)
함수는 오직 하나의 인자를 가집니다.String
값을 출력하는 greet(person:)
함수 버전입니다:->
) 또는 반환 타입을 포함하지 않습니다.NOTE 엄밀히 말하면greet(person:)
함수는 반환값을 정의하지 않았지만 여전히 반환값이 있습니다. 반환 타입이 정의되지 않은 함수는Void
타입의 특별한 값을 반환합니다. 이것은()
로 쓰여진 빈 튜플입니다.
printAndCount(string:)
은 문자열을 출력하고 문자 갯수를 Int
로 반환합니다. 두번째 함수 printWithoutCounting(string:)
은 첫번째 함수를 호출하지만 반환값을 무시합니다. 두번째 함수가 호출될 때 첫번째 함수에 의해 메세지는 출력되지만 반환된 값은 사용하지 않습니다.NOTE 반환값은 무시할 수 있지만 함수는 항상 값을 반환할 것입니다. 정의된 반환 타입이 있는 함수는 반환되는 값 없이 함수의 바닥에서 밖으로 빠져 나오는것을 허락하지 않고 그렇게 하면 컴파일 시 에러가 발생합니다.
Int
값의 배열에서 가장 작은값과 가장 큰값을 찾는 minMax(array:)
함수를 정의합니다:minMax(array:)
함수는 2개의 Int
값을 포함한 튜플을 반환합니다. 이 값들은 함수의 반환 값을 조회할 때 이름으로 접근할 수 있도록 min
과 max
로 라벨되어 있습니다.minMax(array:)
함수의 바디는 배열의 첫번째 정수의 값을 currentMin
과 currentMax
라 불리는 2개의 동작 변수에 값을 설정하는 것으로 시작합니다. 그러면 함수는 배열의 나머지 값들을 반복하고 각 값이 currentMin
과 currentMax
의 값보다 더 작거나 더 큰지 확인합니다. 마지막으로 가장 작고 가장 큰 값은 2개의 Int
값인 튜플로 반환됩니다.nil
일 수 있다는 사실을 반영할 수 있습니다. (Int, Int)?
또는 (String, Int, Bool)?
와 같이 튜플 타입의 닫는 소괄호 다음에 물음표를 붙여 옵셔널 튜플 반환 타입을 작성합니다.NOTE(Int, Int)?
와 같은 옵셔널 튜플 타입은(Int?, Int?)
와 같이 옵셔널 타입을 가지는 튜플과는 다릅니다. 옵셔널 튜플 타입은 튜플 안에 각각의 값이 옵셔널이 아니라 전체 튜플이 옵셔널이라는 의미입니다.
minMax(array:)
함수는 2개의 Int
값을 포함하는 튜플을 반환합니다. 그러나 이 함수는 배열이 전달될 때 아무런 안정성 확인을 하지 않습니다. array
인자가 빈 배열을 포함하면 위에서 정의된 minMax(array:)
함수는 array[0]
을 접근할 때 런타임 에러가 발생합니다.minMax(array:)
함수는 옵셔널 튜플 반환 타입을 가지고 배열이 비어있을 때 nil
을 반환합니다:minMax(array:)
함수가 실제 튜플 값을 반환하는지 nil
을 반환하는지 확인할 수 있습니다:greeting(for:)
함수의 전체 정의는 인사말 메세지를 반환하고 이것은 짧은 표현으로 사용할 수 있다는 의미입니다. anotherGreeing(for:)
함수는 긴 함수와 같이 return
키워드를 사용하여 같은 인사말 메세지를 반환합니다. 단일 return
으로 작성된 함수는 return
을 생략할 수 있습니다.NOTE 암시적 반환값으로 작성하는 코드는 일부값을 반환하기 위해 필요합니다. 예를 들어 암시적 반환값으로print(13)
을 사용할 수 없습니다. 그러나fatalError("Oh no!")
와 같이 Swift 가 암시적 반환이 일어나지 않는 것을 아는 경우에는 사용할 수 있습니다.
greet(person:)
함수의 변형입니다:_
)를 작성합니다....
)를 추가하여 작성합니다.numbers
라는 이름과 Double...
타입을 가진 가변 파라미터는 함수 바디 내에서 [Double]
타입의 numbers
라 불리는 상수 배열로 사용할 수 있습니다.inout
키워드를 작성합니다. in-out 파라미터는 함수로 전달하는 값을 가지고 있고 함수로 부터 이 값을 수정하고 원래 값을 대체하기위해 함수 밖으로 다시 되돌려 줍니다. In-out 파라미터와 컴파일러 최적화의 동작에 대한 자세한 설명은 In-Out 파라미터 (In-Out Parameters) 를 참고 바랍니다.&
)를 붙여줍니다.NOTE in-out 파라미터는 기본값을 가질 수 없고 가변 파라미터는inout
으로 표기할 수 없습니다.
a
와 b
라 하는 2개의 in-out 정수 파라미터를 가지는 swapTwoInts(_:_:)
입니다:swapTwoInts(_:_:)
함수는 간단하게 b
의 값을 a
로 a
의 값을 b
로 바꿉니다. 이 함수는 a
의 값을 temporaryA
라 하는 임시 상수에 저장하고 b
의 값을 a
에 할당하고 temporaryA
의 값을 b
에 할당합니다.Int
타입의 바꿀 2개의 변수를 이용하여 swapTwoInts(_:_:)
함수를 호출할 수 있습니다. swapTwoInts(_:_:)
함수에 전달할 때 someInt
와 anotherInt
의 이름 앞에 앰퍼샌드를 붙여야 합니다:someInt
와 anotherInt
의 기본값이 함수의 바깥에서 정의되었지만 swapTwoInts(_:_:)
함수로 인해 원래값이 수정되는 것을 보여줍니다.NOTE in-out 파라미터는 함수에서 값을 반환하는 것과 다릅니다. 위의swapTwoInts
예제는 반환 타입을 정의하거나 값을 반환하지 않지만someInt
와anotherInt
의 값은 여전히 수정합니다. In-out 파라미터는 함수가 함수 바디의 범위를 벗어나 영향을 미치는 다른 방법입니다.
addTwoInts
와 multiplyTwoInts
라 불리는 간단한 수학 방정식 함수를 정의합니다. 이 함수는 각각 2개의 Int
값을 가지며 적절한 수학 연산을 수행하여 Int
값을 반환합니다.(Int, Int) -> Int
입니다. 이것은 아래와 같이 읽을 수 있습니다:Int
타입인 2개의 파라미터를 가지며 Int
타입을 반환합니다."() -> Void
또는 "함수는 파라미터가 없고 Void
를 반환합니다."Int
값과 Int
를 반환하는 함수' 의 타입을 가지는 mathFunction
이라는 변수를 정의합니다. addTwoInts
라는 함수를 참조하기 위해 새로운 변수에 설정 하십시오."addTwoInts(_:_:)
함수는 mathFunction
변수와 같은 타입을 가지므로 Swift의 타입 검사기는 할당을 허락합니다.mathFunction
이라는 이름으로 할당된 함수를 호출할 수 있습니다:(Int, Int) -> Int
와 같은 함수 타입을 다른 함수의 파라미터로 사용할 수 있습니다. 이렇게 하면 함수 호출자가 함수가 호출될 때 제공할 함수 구현의 일부 측면을 남길 수 있습니다.printMathResult(_:_:_:)
라는 함수를 정의합니다. 첫번째 파라미터는 mathFunction
이라 불리는 (Int, Int) -> Int
타입입니다. 이 첫번째 파라미터의 인수로 해당 타입의 함수를 전달할 수 있습니다. 두번째 세번째 파라미터는 a
와 b
라 불리고 둘다 Int
타입입니다. 이들은 제공된 수학 함수의 2개의 입력값으로 사용됩니다.printMathResult(_:_:_:)
호출할 때 addTwoInts(_:_:)
함수와 정수 3
과 5
가 전달됩니다. 3
과 5
로 제공된 함수를 호출하고 8
의 결과를 출력합니다.printMathResult(_:_:_:)
의 역할은 적절한 타입의 수학 함수를 호출하고 값을 출력합니다. 이것은 함수의 실질 동작 구현이 어떻게 되는지는 상관없고 함수의 올바른 타입에 대해서만 관여합니다. 이렇게 하면 printMathResult(_:_:_:)
가 해당 기능의 일부를 타입이 안전한 방식으로 함수 호출자에게 전달할 수 있습니다.->
) 바로 뒤에 완전한 함수 타입을 작성하여 이를 수행합니다.stepForward(_:)
와 stepBackward(_:)
라 불리는 간단한 2개의 함수를 정의합니다. stepForward(_:)
함수는 입력값에 1을 더해 반환하고 stepBackward(_:)
함수는 입력값에 1을 빼고 반환합니다. 두 함수 모두 (Int) -> Int
타입입니다:(Int) -> Int
인 chooseStepFunction(backward:)
입니다. chooseStepFunction(backward:)
함수는 backward
부울 파라미터를 토대로 stepForward(_:)
함수 또는 stepBackward(_:)
함수를 반환합니다:chooseStepFunction(backward:)
를 사용하여 한방향 또는 다른 방향으로 이동할 함수를 얻을 수 있습니다:currentValue
라는 변수를 점차적으로 0에 가깝게 이동하기 위해 양수 또는 음수 단계가 필요한지 여부를 결정합니다. currentValue
는 3
의 초기값을 가지며 이것은 currentValue > 0
이 true
를 반환한다는 의미이며 chooseStepFunction(backward:)
가 stepBackward(_:)
함수를 반환하도록 합니다. 반환된 함수의 참조는 moveNearerToZero
라는 상수에 저장됩니다.moveNearerToZero
가 올바른 함수를 참조하므로 0으로 계산하는데 사용할 수 있습니다:chooseStepFunction(backward:)
를 중첩 함수를 사용하고 반환하도록 다시 작성할 수 있습니다: