Swift 입문9 – Optional 형

2014-10-05
15 Views
1 Comments

Optional 형을 알기 전에 우선 Objective-C에서 nil 처리 방식이 변경된 것부터 이해해야 합니다.

nil 확인

Objective-C에서 nil을 체크할 때 NSAssert 를 사용해서 확인했습니다. NSAssert을 사용하면 nil이 있으면 앱을 종료했습니다.

Swift언어는 nil 처리하는 방법이 바뀌었기 때문에 MSAssert를 사용하는 방법이 변경되었습니다.

Swift에서 nil 확인

우선 아래와 같이 코드를 만듭니다.

[swift]

import UIKit

var name = "MJ Kim"

println(name)

[swift]

결과는 MJ Kim가 표시됩니다. 크게 새로운 것이 없습니다. 변수에 값을 입력하는 부분을 삭제하고 name을 nil로 합니다. 또한 입력이 없으면 형을 알 수없기 때문에 형 지정을 추가했습니다.

[swift]

import UIKit

var name : String

println(name)

[/swift]

optinal-nil-check1

 

name변수를 초기화하기 전에 이용하고 있다면서 오류가 발생합니다. 이는 Objective-C에서는오류가 발생하지 않습니다.

[objc][/objc]

NSString * name;

NSLog (@”%@”, name);

[objc][/objc]

그렇다면 Swift코드에 nil을 추가해 봅시다.

[swift]

import UIKit

var name : String = nil

println(name)

[/swift]

optional-nil-check

 

이 또한 오류가 발생합니다. String형 name 변수에 String을 넣어야 한다는 것입니다. Swift언어는 버그가 발생하지 않도록 안전성을 추구하는 언어이기때문에 이런 오류처리를 합니다. 그렇다면 nil을 사용할 수 없을까?

API에 요청해서 리턴값이 없는 것도 있을 것이고 다양한 경우에 따라 리턴값이 없을 수 있습니다. 그래서 어떻게 해야할까?

그래서 나온 것이 바로 Optional 형이라는 것이 있는 것입니다.

Optional 형

형을 지정한 마지막에 “?”을 추가만 하면 됩니다.

var name : String?

이제 name변수에 nil 또는 String형을 넣을 수 있게 됩니다.

[swift]

import UIKit

var name : String?

println(name)

[/swift]

optional-nil-check2

 

참고로 nil을 선언해도 오류는 나지 않습니다.

그렇다면 문자열을 넣어서 확인해 봅시다.

optional-nil-check4

 

입력한 문자열은 표시되지만, Optional()이라는 것이 추가적으로 붙습니다. ?을 붙이면 Optional형이라고 하여 String형처럼 사용할 수 없는 것 같습니다. 이를 확인해 봅시다.

[swift]

import UIKit

var name : String? = "MJ Kim"

name = name.uppercaseString

println(name)

[/swift]

optional-nil-string

Optional형의 풀기(unwrapping)

String?은 uppercaseString을 사용할 수 없는 것 같습니다. Optional형은 nil이 들어 있을 수 있어 Swift는 Optional형 그대로 사용하는 것을 제한하여 안전성을 높이는 것으로 보여집니다. 다만, 다시 다른 변수에 넣을때 String형으로 사용할 수 있습니다.

[swift]

import UIKit

var name : String? = "MJ Kim"

if let unwrapName = name {

println(unwrapName)

}

[/swift]

optional-string-unwrapping

 

또는

[swift]

import UIKit

var name : String?

if let unwrapName = name {

println(unwrapName)

} else {

println("nil!")

}

[/swift]

optional-nil-string1

즉, if문 조건이 풀기(unwrapping)되어 있는 경우,

풀기가 되는 경우 true, 풀수 없는 경우 nil(false)로 처리하는 것 같습니다.

강제적인 풀기(unwrapping)

Optional형의 변수를 다른 변수에 넣지 않아도 풀기를 할 수 있습니다. 이를 강제적인 풀기라고 말합니다. 사용방법은 변수명 마지막에 “!”을 추가하는 것입니다.

[swift]

import UIKit

var name : String? = "MJ Kim"

println(name!.uppercaseString)

[/swift]

optional-string-uppercaseString

위와 같이 작성하면 오류가 발생하지 않습니다. 다만 풀기로 한 변수가 nil일 경우에는 오류가 발생합니다. 즉, 이렇게 강제적인 풀기는 Swift언어가 추구하는 안전성에 위배되기 때문에 사용하는 것을 추천하고 싶지는 않습니다.

암시적인 풀기(Unwrapping)

변수 형을 지정할 때 형 마지막에 “!”을 추가하는 것입니다.

[swift]

import UIKit

var name : String! = "MJ Kim"

println(name!.uppercaseString)

[/swift]

솔직히 암시적인 풀기는 무엇을 위해 사용해야 할지 애매합니다.

 

 

Facebook Comments

You may be interested

Gif 애니메이션으로 로딩 구현하기
Swift 3.0
shares9 views
Swift 3.0
shares9 views

Gif 애니메이션으로 로딩 구현하기

MJ Kim - 5월 24, 2017

이번에는 MBProgressHUD 라이브러리와 FLAAnimatedImage 라이브러리를 사용하여 gif 애니메이션을 사용하는 방법을 정리해본다. Cocoapods를 사용하여 라이브러리를 추가해도 되고 Carthage를 사용해서 추가해도 된다.…

Bluetooth기반 iOS기기로 통신하기
Swift 3.0
shares5 views
Swift 3.0
shares5 views

Bluetooth기반 iOS기기로 통신하기

MJ Kim - 5월 23, 2017

제 블로그에 관심이 있는 분이 블루투스를 사용한 방법을 알려달라고 하셔서 좀더 이해하기 쉬운 방법을 고민해서 한가지 팁을 공유합니다. 블루투스(Bluetooth)로 1대1로…

Apple지도 및 구글지도 앱을 여는 방법
Swift 3.0
shares7 views
Swift 3.0
shares7 views

Apple지도 및 구글지도 앱을 여는 방법

MJ Kim - 5월 16, 2017

지도 중심에 핀을 넣기 특정 지점에서 특정지점 루트를 표시하기  Apple 지도 앱 지도 중심에 핀세워서 위치 표시 [crayon-592950052b74b566583410/] 경로 표시…

One Response

  1. Swift 입문자들에게 optional 은 꽤 혼란스럽습니다.
    정리를 잘 해주셨네요. 고맙습니다~~