iOS/swift

swift - Optional (basic)

돌맹이시터 2021. 8. 25. 02:19

 

 

Optional

: optional data type allows "nil" to be a value for the variable or constant.

 

 

 

 

먼저 네 가지 변수의 선언을 비교해볼 것이다.

 

 

var a:Int = 1

 

var b:Int? = nil

 

var c:Int? *** 이처럼 값을 따로 할당하지 않는 경우, 기본적으로 nil값이 할당됨

// c can store an int or nil, but it is wrapped.

 

var d:Int!

// d can store an int or nil, but it is already unwrapped.

 

 

 

 

위와 같이 data type 뒤에 ?를 붙여주면 optional data type이 되며,

optional data type인 경우 변수나 상수의 값이 nil(=empty)이 될 수도 있게 된다.

*** 다른 data type의 경우 nil이 될 수 없다.

 

d와 같이 data type 뒤에 !를 붙여주면 unwrap되어버리기 때문에 사용에 주의가 필요하다.

 

 

 

 

값이 존재할 수도, 존재하지 않을 수도(=nil) 있기 때문에

값이 empty인지(nil인지), object가 있는지(nil이 아닌지) 확인하는 과정이 필요하다.

 

 

 

 

 

1. if 활용

 

import UIKit

class XmasPresent {

	func surprise() -> Int {
    	return Int.random(in: 1...10)
    }
}

let present1:XmasPresent? = nil
let present2:XmasPresent? = XmasPresent()

// Check the optional to see if it contains an object
if present1 != nil or present2 != nil {
	// it contains an object
    // call the surprise function --- needs "unwrap"
    print(present1!.surprise())
    print(present2!.surprise())
}

 

 

optional variable / optional constant에 접근하기 전에, optional을 "unwrap"해야 한다.

nil일 수도, object일 수도 있기 때문이다.

 

optional variable / optional constant 가 선물상자라고 가정했을 때

위의 예시에서 if 문을 통해 present가 nil이 아닐 경우를 조건으로 두고 접근했지만,

실제로는 선물상자를 흔들어보기만 한 것과 같다.

흔들어서 소리가 나지 않으면 nil(empty)이라는 것을 알 수는 있지만

실제로 선물에 접근할 수는 없는 것과 마찬가지이다.

그렇기 때문에 "unwrap"하는 과정이 필요한 것이다.

 

unwrap은 위의 예시에서처럼 ! 기호로 할 수 있다.

 

예시 코드의 결과는

비어있지 않은 present2 값만 출력되며, Xmaspresent를 통해 생성된 랜덤한 숫자가 출력된다.

 

 

 

 

 

 

 

2. Optional binding

 

 

import UIKit

class XmasPresent {
	func surprise() -> Int {
    	Return Int.random (in: 1...10)
    }
}

let present:XmasPresent? = XmasPresent()

// Optional binding
if let actualPresent = present {
	print(actualPresent.surprise())
}

 

 

 

 

만약 present (optional variable)가 nil이라면 if문을 그냥 지나칠 것이고,

present (optional variable)가 object을 갖는다면

if문에서 선언한 actualPresent (constant)에 해당 값을 unwrap& assign하고, if문의 코드블럭을 실행한다.

여기서 포인트는 unwrap해서 assign하기 때문에 코드블럭 안에서 unwrap을 할 필요가 없다는 것이다.

 

 

예시의 결과는 위에서와 마찬가지로

만약 present(optional variable)의 값이 nil이 아니라면, surprise method를 통해 생성된 랜덤한 숫자가 출력될 것이다.

 

 

 

 

 

 

 

3. Optional chaining

 

 

 

import UIKit

class XmasPresent {
	func surprise() -> Int {
    	Return Int.random (in: 1...10)
    }
}

let present:XmasPresent? = XmasPresent()

// Optional chaining
present?.surprise()

 

 

가장 단순하게 사용할 수 있는 방법이다.

한 줄의 코드를 가지고 nil인지, actual object인지를 판단해서 

nil이라면 실행하지 않고, object라면 실행하도록 한다.

 

 

결과는 위의 예시들과 같다.