Swift3(스위프트3)

swift3 스위프트3 Optional 옵셔널이란?

알통몬_ 2017. 7. 4. 12:01
반응형


안녕하세요 알통몬입니다.

공감 및 댓글은 포스팅 하는데 아주아주 큰 힘이 됩니다!!

포스팅 내용이 찾아주신 분들께 도움이 되길 바라며

더 깔끔하고 좋은 포스팅을 만들어 나가겠습니다^^

 

이번 포스팅에서는 옵셔널에 대해서 공부하겠습니다.

 

Optional : 값이 있을 수도 있고 없을 수도 있음

Optional을 사용하는 이유는 nil의 가능성을 명시적으로 표현하기 위해서 입니다.


Optional을 사용함으로써 얻을 수 있는 이점

 - nil 가능성을 문서화하지 않더라도 코드만으로 충분히 표현 가능합니다.

 - 문서나 주석의 작성 시간을 절약할 수 있습니다.

 - 전달 받은 값이 옵셔널이 아니라면 nil 체크를 하지 않아도 안심하고 사용할 수 있습니다.

 - 효율적으로 코딩을 할 수 있고 예외 상황을 최소화하는 안전한 코딩 방법이 됩니다.


ex)

 - Optional

     func someFunc1(someOpParam : Int?) {

          //.....

     }

     func someFunc2(someOpParam : Int) {

         //.....

     }

     someFunc1(someOpParam : nil) // 에러 X

     someFunc2(someOpParam : nil) // 에러 발생


옵셔널 선언

     let val1 : Optional<Int> = nil

     let val2 : Int? = nil


옵셔널에는 ? 와 !를 사용할 수 있습니다.


! : 암시적 추출 옵셔널

var opVal : Int! = 10

 - 기존 변수처럼 사용가능합니다.

opVal = opVal + 10

- nil을 할당할 수 있습니다.

opVal = nil

- 잘못된 접근은 오류를 발생합니다.

opVal = opVal  + 1 ( 위에서 opVal에 nil을 할당했으므로)


?

var opVal2 : Int? = 10

- 기존 변수처럼 사용할 수 없습니다.

opVal2 = opVal2 + 10 // X

- nil을 할당할 수 있습니다.

opVal2 = nil


switch 문에서 사용방법

switch opVal {

     case .none

            print("no value")

     case .some(let val) 

            print("value is \(val)")

}


옵셔널 추출

추출 방법에는 두 가지가 있습니다.

- 옵셔널 바인딩

 : nil 체크를 하고, 안전한 값 추출을 할 수 있음.

ex)

    func printName(_ name : String) {

      print(name)

    }

    var myName : String? = nil

    printName(myName) // 전달되는 값의 타입이 달르기 때문에 컴파일 오류가 발생합니다.


    if - let 방식 사용.

    func printName(_ name : String) {

      print(name)

    }

    var myName : String! = nil

    if let name : String = myName {

      printName(name)

    } else {

      print("myName == nil")

    } // let name 의 name 상수는 if-let 구문 안에서만 사용가능.

    var myName : String? = "altong"

    var yourName : String? = nil

    // if - let 구문은 if - let 구문안에서 사용되는 변수들 모두에 값이 있어야 실행됩니다.

    if let i = myName, let you = yourName {


    } // yourName이 nil 이기 때문에 실행되지 않습니다.

    yourName = "mon"

    if let i = myName, let you = yourName {


    } // myName 과 yourName에 모두 값이 있으므로 실행


- 옵셔널 강제 추출 

 : 추천하지 않는 방법입니다.

ex)

  func printName(_ name : String) {

      print(name)

    }

    var myName : String? = "altong"

    printName(myName!) // 옵셔널 값의 타입을 강제 추출

    myName = nil

    print(myName!) // 강제 추출 시 값이 없기 때문에 런타임 오류가 발생합니다.


    var yourName : String! = nil // 암시적추출 옵셔널 형식은

    호출 시 강제 추출을 예상하고 선언하는 것

    print(yourName) //호출 시 yourName! 과 같은 효과


이상입니다.


다음 포스팅에서는 구조체와 클래스에 대해 공부하겠습니다.

반응형