Swifter {Swift Developer}

메뉴

Swift 입문9 – Optional 형

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

카테고리:   Swift Books

댓글

죄송하지만 댓글은 닫혀 있습니다.