Swift 입문9 – Optional 형

2014-10-05
2 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

Xcode 기능 확장(Extension) 제거하기
Xcode
shares3 views
Xcode
shares3 views

Xcode 기능 확장(Extension) 제거하기

MJ Kim - 3월 18, 2017

Mac에서 Xcode Source Editor Extension등의 기능확장을 사용하다보면 디버깅시 시스템 환경 설정의 확장이 앱에 등록되는 경우가 있다. 계속해서 목록이 남아 있기…

iOS App Store Review(앱 심사약관) 번역
Swift 3.0
shares112 views
Swift 3.0
shares112 views

iOS App Store Review(앱 심사약관) 번역

MJ Kim - 3월 15, 2017

App Store Review를 번역했다. 사실 이번에 좀 애매한 리젝을 당해서 그걸 이해하고자 정리해본다. 원문링크: https://developer.apple.com/app-store/review/guidelines/ 1. 이약관은? 1.1 앱 개발자로서 프로그램의…

Raspberry Pi 타이머 On/Off 전원제어모듈 RPi1114-Raspberry Pi
IoT by Raspberry Pi
shares7 views
IoT by Raspberry Pi
shares7 views

Raspberry Pi 타이머 On/Off 전원제어모듈 RPi1114-Raspberry Pi

MJ Kim - 3월 04, 2017

RPi1114-Raspberry Pi전원제어 모듈이 있다. 이 제품은 40Pin GPIO핀헤더에 연결하여 사용하는 모듈로 Cortax-M0마이크로컨트롤러 LPC1114를 내장하고 Raspberry Pi의 시작과 정지 순서등을 프로그래밍할…

One Response

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