함수

  • 특정 태스크를 수행하는 코드블록을 뜻한다.
  • 함수에 이름을 부여함으로써 무슨 일을 하는지 또 각 함수를 구분하며 실제 호출을 통해서 태스크를 수행시킬 수 있다.
  • 인자
    • 기본값 제공 : 인자 전달안해도 기본값으로 설정되는 기능
    • in-out 속성 : 인자의 값이 바뀌는 것을 허용
  • 함수의 속성
    • 모든 함수는 타입을 가진다.
    • 인자 타입과 반환 타입으로 구성된다.
    • swift의 다른 타입과 동일하게 사용할 수 있다.
    • 즉 함수를 함수의 인자로도 사용할 수 있다.
    • netsted 함수를 이용해서 함수 내부에서 정의하여 사용할 수 있다.

함수 정의 및 호출

  • 함수를 정의할 때
    • 1개 이상 이름 정의
    • 인자로 받을 타입
    • 함수처리 후 결과를 반환하는 타입
  • 모든 함수는 함수 이름을 가진다. 이 이름을 통해서 함수가 수행하는 태스크를 설명할 수 있다. 함수를 사용하는 것을 호출(call)이라고 한다. 호출 시에 함수 이름과 함수에 전달할 인자를 사용한다. 함수의 인자는 함수를 인자를 정의한 순서와 같게 입력해야만 한다.

  • 아래 예제는 사람의 이름을 입력으로 받아서 사람 이름과 함께 인사를 출력한다. 입력 파라미터는 String 타입이고 반환 타입 역시 String 타입이다.

    func sayHello(personName: String) -> String {
     let greeting = "Hello, " + personName + "!"
     return greeting
    }
    
  • 더해야함!!!!!!!!!!!!!!!!!

함수 파라미터와 반환 값

  • Swift에서 함수 파라미터와 반환값을 사용하는데 있어 유연성을 제공하고 있다. 복잡한 함수에 단일 이름을 붙이지 않은 파라미터를 가진 유틸리티 함수를 정의할 수 있다.

파라미터 없는 함수

  • 함수 중에는 입력 파라미터를 가지지 않는 함수도 있다. 아래에 입력 파라미터가 없는 함수가 있다. 이 함수는 항상 동일한 String 메시지를 반환한다.
func sayHelloWorld() -> String {
    return "hello, world"
}

print(sayHelloWorld())
  • 함수 정의는 함수 이름 뒤에 괄호를 사용한다. 파라미터를 갖지 않더라도 괄호를 붙여야 한다. 함수를 호출하는 경우에도 함수 이름 뒤에 괄호를 붙인다.

파라미터를 가지는 함수

  • 함수는 여러 입력 파라미터를 가질 수 있다. 입력 파라미터는 함수 이름 뒤에 괄호 안에 순서대로 입력하며 각 파라미터를 구분하는데 ,를 사용한다.
  • 이 함수는 사람의 이름 그리고 이미 인사를 했는지 여부를 받아서 적절한 인사말을 반환한다.
func sayHello(personName: String, alreadyGreeted: Bool) -> String {
    if alreadyGreeted {
        return syaHelloAgain(personName)
    } else {
        return sayHello(personName)
    }
}
  • sayHello 함수는 String과 Bool 타입 이렇게 2개 파라미터를 입력으로 받는다. 각 입력 파라미터에 대해서 personName, alreadyGreeted 와 같이 레이블을 붙였다.
  • 2개 이상 파라미터를 가지는 함수를 호출하는 경우 2번째 파라미터부터 해당 파라미터의 이름으로 레이블을 붙여서 사용한다.
  • 자세한 내용은 함수 파라미터 이름을 참고하자.

반환값이 없는 함수

  • 함수 중에는 반환값이 없는 것도 있다. 여기 sayGoodbye 함수가 반환값이 없는 경우다.
func sayGoodbye((personName: String) {
    print("Goodbye, \(personName)!")
}

sayGoodbye("Jeyong")
  • 반환값이 필요 없는 함수이므로 함수의 정의는 반환타입을 정의하는 ->을 사용하지 않는다.
  • 주의 : 엄격히 말해서 sayGoodbye 함수는 값을 반환하기는 한다. 비록 반환 값이 정의를 하지는 않았지만 말이다. 반환 타입을 정의하지 않은 함수는 Void 라는 특별한 타입의 값을 반환한다. 빈 튜플로 엘리먼트가 없는 튜플이며 ()게 표현할 수 있다.
  • 함수의 반환값은 호출할 때 무시할 수 있다.
func printAndCount(stringToPrint: String) -> Int {
    print(stringToPrint)
    return stringToPrint.characters.count
}

func printWithoutCounting(stringToPrint: String) {
    printAndCount(stringToPrint)
}

printAndCount("hello, world")

printWithoutCounting("hello, world")
  • 첫번째 printAndCount 함수는 문자열을 출력하고 무자 갯수를 반환한다. 두번째 함수인 printWithoutCounting 함수는 첫번째 함수를 호출하지만 반환값은 무시한다. 두번째 함수가 호출될 때, 메시지는 첫번째 함수에 의해 출력되지만 반환값은 사용하지 않는다.
  • 주의 : 반환값은 무시할 수 있지만, 반환값을 가지는 함수는 항상 값을 반환해야만 한다. 함수내 제어 흐름에서 반환하는 것이 없다면 컴파일시에 에러를 발생시킨다.

반환값을 가지는 함수

  • 함수가 여러 값을 반환하는 경우 튜플 타입을 사용해서 반환값을 하나로 묶을 수 있다.
  • minMax호출 하는 함수로 Int 타입 배열에서 가장 작은 값과 가장 큰 값을 찾는 예제이다.
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)
}
  • minMax 함수는 2개 Int 값을 가지는 튜플을 반환한다. 이 값에는 각각 min과 max라는 레이블을 붙여서 함수의 반환값에 접근하는데 이 이름을 사용할 수 있다.
  • minMax 함수 내부에는 currentMin과 currentMax라는 변수에 배열의 첫번째 값으로 설정했다. 이 함수는 배열내에 나머지 값으로 이터레이션을 통해 각 값이 currentMin이나 currentMax보다 더 작은지 더 큰 값을 가지는지를 검사한다. 마지막으로 최종 가장 작은 값과 가장 큰 값을 가지는 튜플로 반환한다.
  • 튜플 멤버 값이 함수의 반환 타입의 일부와 같은 타입의 이름이기 때문에 최소, 최대 값을 얻는 문법으로 .을 사용할 수 있다.
let bounds = minMax([8, -6, 2, 109, 3, 71])
print("min is \(bounds.min) and max is \(bounds.max)")
  • 튜플 멤버의 이름은 함수 내부에서 반환하는 튜플에 이름을 주는 방식이 아니다. 이 이름은 함수의 반환 타입의 일부로 이미 지정되어 있기 때문이다.

Optional 튜플 반환 타입

  • 함수에서 반환하는 튜플 타입은 튜플에 아무런 값도 없다면 전체 튜플이 nil이라는 것을 알리기 위해 option 튜플 타입 반호나 타입을 사용한다. 튜플 타입의 닫는 괄호 뒤에 ?을 붙이면 optional 튜플 반환 타입을 의미한다. (Int, Int)?나 (String, Int, Bool)?과 같은 형태다.
  • 주의 : (Int, Int)?과 같은 optional 튜플 타입은 (Int?, Int?) 타입과 의미가 다르다. Optional 튜플 타입을 가지고 있는지 아니면 전체 튜플이 optional인지를 나타낸다.
  • 위에 minMax 함수는 2개 Int 값을 포함하는 튜플을 반환한다. 그러나 이 함수는 전달하는 배열에서 어떠한 안전 검사도 수행하지 않는다. 만약 array 인자가 빈 배열을 포함하고 있따면 minMax 함수는 array[0]에 접근하려고 할 때, 런타임 에러를 발생시킨다.
  • 빈 배열에 접근하는 경우 안전하게 처리하기 위해서는 optional 튜플 반환 타입을 가지는 minMax 함수를 작성하고 배열이 비어있는 경우 nil 값을 반환한다.
  • 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)
    }
    
  • minMax 함수가 실제 튜플값을 혹은 nil을 반환하는지 검사하기 위해 optional binding을 사용할 수 있다.
if let bounds = minMax([8, -6, 2, 109, 3, 71]) {
    print("min is \(bounds.min) and max is \(bounds.max)")
}
//최소값은 -6이고 최대값은 109이다.

함수 파리미터 이름

  • 함수 파라미터는 외부 파라미터 이름과 지역 파라미터 이름을 가진다. 외부 파라미터 이름은 함수 호출에 전달되는 인자에 이름을 붙이는데 사용한다. 지역 파라미터 이름은 함수 구현내부에 사용한다.
func someFunction(firstParameterName: Int, secondParameterName: Int) {

}

someFunction(1, secondParameterName: 2)
  • 기본적으로 첫번째 인자에서는 외부 이름을 생략한다. 두번째 파라미터부터 외부 이름으로 지역이름을 사용할 수 있다. 모든 파라미터는 반드시 서로 구별되는 지역 이름을 가지고 있어야만 한다. 비록 여러 파라미터가 동일한 외부 이름을 가지는 것이 가능하지만 외부 이름은 코드의 가독성을 높인다.

외부 파라미터 이름 지정

  • 지역 파라미터 이름에 앞서 외부 파라미터 이름을 먼저 적는다. 구분은 공백으로 한다.
func someFunction(externalParameterName localParameterName: Int) {
}
  • 주의 : 여러분이 외부 파라미터 이름을 제공한다면 외부 이름은 반드시 함수를 호추랗ㄹ 때 사용해야만 한다.

  • 두 사람의 이름을 인자로 가지고 사라믇ㄹ에게 인사를 반환하는 sayHello 함수의 버전이 있다.

func sayHello(to person: String, and anotherPerson: String) -> String {
    return "Hello \(person) and \(anotherPerson)!"
}

print(sayHello(to: "Bill", and: "Ted"))
  • 2개 파라미터에 대해서 지정한 외부 파라미터 이름을 지정하면 sayHello 함수에 첫번째와 두번째 인자 모두에 이름을 붙여서 써야만 한다.
  • 외부 파라미터 이름을 사용하면
    • 표현이 명확하고
    • 영어 문장같이
    • 가독성이 높아지고 의도가 명확해 지는 효과가 있다.

외부 파리미터 이름 생략

  • 2번째 파라미터부터 외부 이름 붙이는 것을 생략하고 싶다면 파라미터의 외부 이름름 자리에 _를 붙이는 것이다.
func someFunction(firstParameterName: Int, _ secondParameterName: Int) {

}
someFunction(1, 2)
  • 주의: 첫번째 인자에서 외부 파라미터 이름을 생략하는 것을 기본으로 제공하므로, 명시적으로 _를 쓰는 것이 추가로 필요하다.

기본 파라미터 값

  • 함수내에 기본값(default value)를 정의하는 방법은 파라미터 타입 뒤에 해당 파라미터에 할당하 ㄹ값을 쓰면 된다. 만약 기본 값이 정의되면 함수를 호출할 때 해당 파라미터를 생략할 수 있다.
func someFunction(parameterWithDefault: Int = 12) {

}
someFunction(6)
someFunction()
  • 주의: 함수의 파라미터 목록의 끝에 기본값을 가지는 파리미터를 둔다. 이렇게 하면 함수에 대한 모든 호출은 기본값이 아닌 인자에 대해서 동일한 순서를 사용하므로 각 경우에 동일한 함수가 호출되는 것을 더욱 명확하게 한다.

가변길이 파라미터

  • 가변길이 파라미터는 없거나 1개 이상의 파라미터를 특정 타입의 값을 받는다. 파라미터가 입력 값이 다양한 개수를 전달할 수 있게 가변 파라미터를 사용한다. 파라미터의 타입 이름 뒤에 ...와 같이 3개 점을 연결해서 쓰면 가변길이 파라미터를 쓸 수 있다.
  • 가변길이 파라미터에 전달된 값은 함수의 몸체내부에 적절한 타입의 배열로 만들수 있다. 예를 들면, numbers이름을 가지고 Double... 타입을 가지는 가변길이 파라미터는 함수의 몸체내부에 [Double] 타입으로 numbers 라는 이름을 가진 상수형 배열로 사용가능하다.
func arithmeticMean(numbers: Double...) -> Double {
    var total: Double = 0
    for number in numbers {
        total += number
    }
    return total / Double(numbers.count)
}
arithmeticMean(1, 2, 3, 4, 5)
arithmeticMean(3, 8.25, 18.75)
  • 주의: 함수는 기껏해야 하나의 가변길이 파라미터를 가질 수 있다.

상수와 변수 파라미터

  • 함수 파라미터는 기본적으로 상수다. 함수 몸체내부에 함수 파라미터의 값을 변경하려고 하면 컴파일 에러가 발생한다. 이말은 여러분은 실수로 파라미터의 값을 변경할 수 없다는 말이다.
  • 그러나 가끔 함수가 파라미터의 값에 대해서 변수형 복사본을 가지고 일을 처리하면 유용하다. 변경 가능한 파라미터를 지정하면 함수내부에서 새로운 변수를 지정하는 것을 피할 수 있다. 변경가능한 파라미터는 상수가 아니라 변수형태이며 함수에서 파라미터의 값의 변경 가능한 복사본을 새로 만든다.
  • 파라미터 이름 앞에 var 키워드를 붙이면 변수형 파라미터를 정의한다.
func alignRight(var string: String, totalLength: Int, pad: Character) -> String {
    let amountToPad = totalLength - string.Characters.count
    if amountToPad < 1 {
        return string
    }
    let padString = String(pad)
    for _ in 1...amountToPad {
        string = padString + string
    }
    return string
}
let originalString = "hello"
let paddedString = alignRight(originalString, totalLength: 10, pad: "-")
  • 이 예제는 alignRight라는 새로운 함수를 정의한다. 이는 더 긴 출력 문자열의 오른쪽 끝에 입력한 문자열을 정렬한다. 왼쪽에 공간이 발생한다면 지정한 패딩 문자로 채운다. 여기서는 문자열 "hello"가 "-----hello"로 변환되었다.
  • alignRight 함수는 입력 파리미터 string을 변수형 파라미터로 지정하였다. 이 말은 string이 이제 지역변수로 사용가능하다는 뜻이며 전달한 문자열 값으로 초기화하고 함수 내부에서 변경이 가능하다는 뜻이다.
  • 이 함수는 얼마나 많은 문자를 string의 오른쪽에 붙여서 오른쪽 정렬을 한다. 이 값은 지역 상수인 amountToPad에 저장한다. 만약 패딩이 필요하면, 이 함수는 당순히 패딩없이 string 입력값을 반환한다.
  • 반면에 이 함수가 새로운 임시 String 상수인 padString를 만들면 pad 문자와 초기화하고 기존 문자열 왼쪽에 padString의 amountToPad 복사본을 추가한다.(String 값은 Character 값에 추가할 수 없다. 따라서 padString 상수는 + 연산자의 양쪽이 String 값이 사용되는지 확인하는데 사용한다.)
  • 주의: 변수 파라미터를 변경시키면 함수 호출이 끝나는 시점에 이 변경값을 계속 유지하지 않으며 함수 본체 밖에서는 접근은 불가능하다. 변수형 파라미터는 함수 호출 내에서만 유효하다.

In-Out 파라미터

  • 위에서 언급한 바와 같이, 변수형 파라미터는 함수 내부에서만 변경할 수 있다. 만약 파라미터 값을 변경하는 함수를 원하고 함수 호출이 끝난 뒤에도 이 변경값을 유지하고 싶다면, in-out 파라미터로 정의해야 한다.
  • inout 키워드를 이용해서 in-out 파라미터를 작성할 수 있다. in-out 파라미터는 함수 내부(in)로 전달하는 값이 변경되어 함수 밖(out)에 있는 원래 값을 변경하여 대체한다는 뜻이다.
  • in-out 파라미터에 대해서 인자로 변수를 전달할 수 있다. 상수나 리터럴 값을 인자로 전달할 수 없다. 왜냐하면 상수나 리터럴은 수정이 불가능하기 때문이다. 변수 이름 앞에 &를 붙이면 inout 파리미터로 인자를 전달하는 경우 함수가 이를 수정할 수 있따는 것을 표시한다.
  • 주의: in-out 파라미터는 기본 값을 가지지 않고 가변길이로 설정할 수 없다. 만약 inout으로 표시할려면 var나 let를 붙일 수도 없다.
  • swapTwoInts라는 함수 예제가 있다. 이는 2개 in-out 정수형 파라미터로 a, b를 가진다.
func swapTwoInts(inout a: Int, inout _ b: Int) {
    let temporaryA = a
    a = b
    b = temporaryA
}
  • swapTwoInts 함수는 단순히 a와 b 값을 서로 바꿔치기 한다. 이 함수는 a를 임시 상수로 저장하고 b를 a에 할당하고 나서 b에 임시로 저장한 값을 할당한다.
  • swapTwoInts 함수는 서로 값을 맞바꿀 Int 타입의 2개 변수 가진다. someInt와 anotherInt 이름 앞에 &를 붙여서 swapTwoInts 함수에 전달한다.
var someInt = 3
var anotherInt = 107
swapTwoInts(&someInt, &anotherInt)
print("someInt is now \(someInt), and anotherInt is now \(anotherInt)")
  • 위에 예제는 someInt와 anotherInt의 원래값이 swapTwoInts 함수로 변경되는 것을 보여준다. 이 값들이 함수 외부에 정의되더라도 변경된다는 것을 보여준다.
  • 주의: in-out 파라미터는 함수의 반환값과 차이점이 있다. swapTwoInts 예제는 반환 타입이나 반환 값을 정의하지 않지만 someInt와 anotherInt의 값을 변경한다. in-out 파라미터는 함수 본체 외부까지 영향을 주는 함수를 만드는 대안이 된다.

함수 타입

  • 모든 함수는 특정 함수 타입을 가진다. 이는 인자 타입과 함수의 반환 타입으로 구성된다.
func addTwoInts(a: Int, _ b: Int) -> Int {
    return a + b
}

func multiplyTwoInts(a: Int, _ b: Int) {
    return a * b
}
  • 이 예제는 addTwoInts와 multiplyTwoInts라는 단순한 2개 수학관련 함수를 정의한다. 이 함수 각각은 2개 Int타입 값을 받고 Int 값을 반환한다. 결과적으로 수학적 연산을 수행한다.
  • (Int, Int) -> Int는 이 함수의 타입이다. 읽는 방법은 :
    • Int 타입으로 2개 파라미터를 갖고 Int 타입 값을 반환하는 함수
  • 여기 다른 예제는 파라미터와 반환값이 없다.
func printHelloWorld() {
    print("hello, world")
}
  • 이 함수의 타입은 () -> Void이다. "파라미터가 없고 Void를 반환하는 함수"라고 읽는다.

함수 타입 사용하기

  • Swift에서 다른 타입처럼 함수 타입을 사용할 수 있다. 예를 들면, 함수 타입으로 상수나 변수를 정의할 수 있고 이 변수에 적절한 함수를 할당할 수 있다.
var mathFunction: (Int, Int) -> Int = addTwoInts
  • 이를 다음과 같이 읽을 수 있다 :
    • "mathFunction이라는 변수를 정의하자면, 2개 Int 값을 갖는 함수의 타입으고 Int 값을 반환한다. 이 새로운 변수는 addTwoInts라는 함수를 참조한다."
  • 할당한 함수를 호출하는데 mathFunction이라는 이름을 사용한다.
print("Result: \(mathFunction(2, 3))")
  • 동일한 타입을 가지는 다른 함수는 동일한 변수에 할당할 수 있다.
mathFunction = multiplyTwoInts
print("Result: \(mathFunction(2, 3))")
  • 다른 타입과 같이 상수나 변수에 이 함수를 할당할 때, Swift가 함수 타입을 예측할 수 있게 그냥 두면 된다. 즉 다른 타입을 사용하는 것과 동일하게 사용할 수 있다.
let anotherMathFunction = addTwoInts

함수 타입을 파라미터 타입처럼

  • (Int, Int) -> Int와 같은 함수 타입을 다른 함수에서 파라미터 타입으로 사용할 수 있다. 함수가 호출될 때, 함수의 호출자가 제공하는 함수의 구현부를 담당하도록 한다.
  • math 함수의 겨로가를 출력해 보자.
func printMathResult(mathFunction: (Int, Int) -> Int, _ a: Int, _ b: Int) {
    print("Result: \(mathFunction(a, b))")
}

printMathResult(addTwoInts, 3, 5)
  • printMathResult라는 함수를 정의했다. 이 함수는 3개 파라미터를 가진다. 첫번째 파라미터는 mathFunction이라 부르고 타입은 (Int, Int) -> Int이다. 첫번째 파라미터로 이와 같은 타입이면 어떤 함수도 전달할 수 있다. 두번째와 세번째 파라미터는 a와 b로 부르고 모두 Int 타입이다. 제공한 math 함수에 대해서 2개 입력 값으로 사용된다.
  • printMathResult 함수가 호출될 때, addTwoInts 함수와 정수값 3, 5를 전달한다. 3, 5 값을 제공한 함수를 호출하고 결과 8을 출력한다.
  • printMathResult의 역할은 적절한 타입의 math 함수 호출 결과를 출력한다. 어떤 함수의 구현부인지 중요하지 않다. 여기서는 그 함수가 단지 올바른 타입을 가지는지만 중요하다. printMathResult는 타입이 안정한 방법으로 함수 호출자에게 이 기능의 일부를 떠넘기게 된다.

함수 타입을 반환 타입으로

  • 다른 함수의 반환 타입으로 함수 타입을 사용한다. 반환 함수의 -> 뒤에 바로 완전한 함수 타입을 작성한다.
  • 다음 예제는 단순한 2개 함수를 정의한다. stepForward 와 stepBackward 함수이다. stepForward 함수는 입력값보다 하나 더 많은 값을 반환하고 stepBackward 함수는 입력값보다 하나 적은 값을 반환한다. 이 함수들 모두 (Int) -> Int 타입을 가진다.
func stepForward(input: Int) -> Int {
    return input + 1
}

func stepBackward(input: Int) -> Int {
    return input - 1
}
  • chooseStepFunction이라 불리는 함수가 있다. 반환 타입은 (Int) -> Int이다. backwards의 값에 따라서 stepBackward나 stepForward를 반환한다.
func chooseStepFunction(backwards: Bool) -> (Int) -> Int {
    return backwards ? stepBackward : stepForward
}
  • chooseStepFunction 함수를 사용해서 다음 스텝을 위한 함수를 얻는다.
var currentValue = 3
let moveNearerToZero = chooseStepFunction(currentValue > 0)
  • 이전 예제에서 변수 currentValue가 점차 0으로 수렴하기 위해서 필요한 양이나 음의 스텝값을 결정했다. currentValue가 초기값으로 3으로 갖고, currentValue > 0은 true 반환을 의미한다. chooseStepFunction은 stepBackward 함수를 반환한다. 반환한 함수에 대한 참조는 상수 moveNearerToZero에 저장된다.
  • moveNearerToZero는 적당한 함수를 참조하고 0을 카운트하는데 사용한다.
print("Counting to zero: ")

while currentValue != 0 {
    print("\(currentValue)... ")
    currentValue = moveNearerToZero(currentValue)
}

print("zero!")

Nested 함수

  • 우리가 지금까지 봤던 모든 함수는 전역 함수 예제였다. 범위가 전역에서 정의했다. 다른 함수의 내부에 함수를 정의할 수 있는데 이를 nested 함수라고 부른다.
  • nested 함수는 기본적으로 외부에 감춰져 있지만 이를 둘러싸고 있는 함수(enclosing 함수)에서 호출하고 사용할 수 있다. enclosing 함수는 nested 함수가 다른 범위에서 사용될 수 있도록 nested 함수 중에 하나를 반환할 수 있다.
  • chooseStepFunction 예제를 nested 함수를 이용해서 다시 작성해보자.
func chooseStepFunction(backwards: Bool) -> (Int) -> Int {
    func stepForward(input: Int) -> Int {
        return input + 1
    }

    func stepBackward(input: Int) -> Int {
        return intpu - 1
    }
    return backwards ? stepBackward : stepForward
}

var currentValue = -4
let moveNearerToZero = chooseStepFunction(curretnValue > 0)

while curretnValue != 0 {
    print("\(currentValue)... ")
    curretnValue = moveNearerToZero(currentValue)
}
print("zero!"0

정의

사용용도

문법

예제

Quiz

  • 정의에 대한 질문
  • 용도에 대한 질문
  • 예제 관련