본문 바로가기

ComputerScience/ios App(Storyboard)

ios - 7 swift 기본문법(Function, Optional)

728x90

1 Function

- 매개변수가 있을 때와 없을 때 함수 정의 및 실행 방법

func printName() {
    print("jsdysw");
}

printName();
func printTotalPrice(price: Int, count: Int) {
    print("Total Price : \(price * count)")
}

printTotalPrice(price:1000, count: 5)

- 함수를 호출할때 매개변수의 이름을 안쓰고 값만 넘겨주고 싶다면 매개변수 앞에 _를 써준다.

- 매개변수 이름을 통해서 함수에게 값을 전달하는데 _를 쓰면 이름 없이 전달이 가능하다는 것을 의미한다.

- 이렇게 외부에서 보여지는 이름을 external name이라고 한다.

func printTotalPrice(_ price: Int, _ count: Int) {
    print("Total Price : \(price * count)")
}

printTotalPrice(1000, 5)

- 그럼 price, count 대신 단가, 개수라는 이름으로 값을 전달하고 싶다면 다음처럼 하면 된다.

- 함수의 external name을 단가, 개수로 적어준다.

func printTotalPrice(단가 price: Int, 개수 count: Int) {
    print("Total Price : \(price * count)")
}

printTotalPrice(단가: 1000, 개수:5)

- 매개변수로 값을 전달하지 않았을 때 default값을 설정하는 방법은 다음과 같다.

- price를 넘겨주지 않을 때 default로 1000을 사용한다는 뜻이다.

func printTotalPrice(price: Int = 1000, count: Int) {
    print("Total Price : \(price * count)")
}

printTotalPrice(count:5)
printTotalPrice(price:2000, count:5)

- 함수가 값을 반환해야 하는 경우는 다음과 같다.

func totalPrice(price: Int, count: Int) -> Int {
    return price * count
}

let calculatedPrice = totalPrice(price: 1500, count:5)

2 Funcion Overloading

- 같은 함수이름을 쓰면서 서로 다른 매개변수를 받는 함수를 만들 수 있다.

- 즉 input과 output이 다른데도 같은 이름의 함수를 만들 수 있는 기능이다.

func add(aInt:Int, bInt:Int) -> Int {
    return aInt + bInt
}

func add(aDouble:Double, bDouble:Double) -> Double {
    return aDouble + bDouble
}

add(aInt: 1, bInt: 2)
add(aDouble: 1.1, bDouble: 2.2)

3 Inout

- 함수를 호출할때 매개변수는 값이 복사되어 들어온다. 그런데 swift는 이 복사된 값을 const로 인식한다.

- 따라서 다음과 같이 a의 값을 변경시키려하면 에러가 난다.

- 따라서 inout이라는 키워드를 타입앞에 붙여준다.

var num = 1

func increment(a: inout Int) -> Int {
    a += 1
    return a
}

increment(a: &num)
print(num);

*여기서 num이라는 변수의 값을 increment에서 바꾸고 싶다면 num을 넘길때 &num으로 전달해줘야 한다.

*만약 num만 넘기면 num의 값이 매개변수 a로는 복사되고 a만 변하기 때문이다.

3 함수를 매개변수로 넘기기

- 이전 예제 에서는 변수만 인자로 함수에게 넘겨주었다. 

- 이번에는 함수를 함수에게 전달해보자.

- swift에서는 함수를 변수에 할당할 수 있다. 

- 그리고 그 변수를 통해서 함수를 호출하는 것도 가능하다.

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

let addFunction = add;
addFunction(6, 4)

- option키를 누르고 변수를 클릭하면 변수의 타입을 알 수 있다.

- addFunction의 타입은 (Int, Int) -> Int이다.

- 그럼 이제 add라는 함수, 서로 더할 두 변수를 인자로 받아서 결과를 출력하는 함수를 만들어보자.

- 함수도 타입이 있기 때문에 같은 타입의 parameter를 넘기도록 하자

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

func printResult(_ function: (Int,Int)->Int, _ a:Int, _ b:Int) {
    let result = function(a,b)
    print(result)
}

printResult(add, 10, 5)

4 Optional

- var money:Int 라는 변수를 정의했다고 하자.

- 변수에 값이 있으면 10, 100등의 value가 저장되어있을 것이다.

- 변수에 값이 들어있으면 그 value를 보여주면 되는데 만약 변수에 값이 없다면 이를 어떻게 표현할까? 그럴때 nil을 사용한다.

- String타입의 변수 name을 정의한다.

- 여기서 ?를 optional이라고 하는데 name에 value가 있을 수도 없을 수도 있다는 것을 의미한다.

- name을 정의하고 값을 대입한 적이 없기 때문에 nil이라고 표현된다.

var name:String?
name = "jsdysw"

name = nil

- 위의 그림처럼 name에 값을 넣었다가 다시 비우고 싶으면 nil을 대입하면 된다.

- 아래 정의한 num의 타입을 추론해보자.

- 문자열을 Int로 캐스팅 했을때 "hi"였다면 캐스팅이 실패하고 값을 담을 수 없을 것이다.

- 이렇게 int로 변환되어 숫자가 들어갈 수도 캐스팅이 실패해서 nil이 들어갈 수도 있는 경우 Int?로 추론된다.

5 Forced unwrapping

- optional? 타입의 변수에 있는 값에 접근하려면 어떻게 해야할까?

- 값이 있을 수도 없을 수도 있기 때문에 값을 꺼내려 하면 다음과 같은 warning과 결과가 나온다.

- 값이 있음을 확신할 수 있다면 !를 사용해서 강제로 값을 꺼내와도 무방하다.

 

6 Optional Binding

- 이번에는 if문으로 조금 부드럽게 optional 타입의 값을 꺼내와 보자.

- 값이 있다면 그 값을 받아서 출력하고 없다면 no name을 출력한다.

let name : String? = "jsdysw"

if let unwrappedName = name {
    print(unwrappedName)
} else {
    print("no name")
}

- 이런 방식으로 String을 받아서 Int로 변환해주는 함수를 만들어보자 만약 Int로 parsing이 불가능하다면 문구를 띄워주자.

func printParsedInt(from : String) {
    if let result = Int(from) {
        print(result)
    } else {
        print("Parsing failed")
    }
}

printParsedInt(from: "10")
printParsedInt(from: "jsdysw")

7 Optional Binding - guard사용

- guard 문을 사용해서 optional의 값을 부드럽게 확인하는 두번째 방법이다.

- condition result를 확인하여 만족을 못 시킬 경우 parsing failed를 출려하고 함수를 종료한다.

- condition을 만족하면 뛰어넘고 print(result)가 수행된다.

func printParsedInt(_ from : String) {
    guard let result = Int(from) else {
        print("Parsing failed")
        return
    }
    print(result)
}

printParsedInt("10")
printParsedInt("jsdysw")

8 Nil coalescing

- 바로 사용 예를 살펴보자

let name: String? = "jsdysw"

let whatIsYourName : String = name ?? "Blank"

- String optional 타입의 변수 name이 있다

- name의 값을 꺼내서 whatIsYourName에 넣으려고 하는데 String이라고 표시해 줌으로써 타입을 String으로 만들어준다.

- 대신 name이 nil인 경우 를 대비해서 ?? "Blank"를 넣는다. 즉 name이 nil이면 Blank를 사용한다는 것이다.

728x90
반응형