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라면 실행하도록 한다.
결과는 위의 예시들과 같다.
'iOS > swift' 카테고리의 다른 글
swift - Array에서 String으로 바꾸기 (0) | 2021.08.30 |
---|---|
swift - Array & Dictionary (basic) (0) | 2021.08.26 |
swift - Split vs Components (문자열을 특정 separator로 나눠서 배열에 리턴) (0) | 2021.08.12 |
swift - Struct vs Class (0) | 2021.07.22 |
Swift - Class & Inheritance (0) | 2021.07.19 |