Swift를 공부하다보면 특정 타입 뒤에 ? 혹은 !가 따라 나오는 것을 볼 수 있다. 이 때, 이 기호들이 바로 Optional정보를 나타낸다.
DataType <ㄱ
var hardness: String?
ㄴ> Optional
Swift는 DataType을 가진 기본 변수에 nil(C로 치면 null)을 넣을 수 없다. 생각해보면 맞는 말이다. nil은 String이라고 할 수 없기 때문... 즉, Optional이 해주는 역할은 아래와 같다
이 변수에는 값이 있을 수도, 없을 수도 있다!
그래서 Swift에서는 타입 뒤에? 를 붙이면서 값이 없을 수도 있다는 상황을 알려주는 것이다.
var player1Username: String = nil // error
var player1Username: String? = nil // OK
var player1Username: String? // OK (위와 동일)
player1Username = "username"
만약 위 변수를 그냥 출력하면 아래와 같은 결과를 얻을 수 있다.
print(player1Username)
우리가 원하는 결과는 "username"인데 Optional() 이라는 블록 안에 값이 나오고 있다. 왜 이런 결과가 생기는 걸까?
그 이유는 바로 Wrapping이다. Optional 타입은 기본적으로 wrap되어 있는 이다. 즉, Optional로 선언된 변수들은 값이 있는 것인지, nil인 것인지 wrap되어 있어서 모르는 상태이다. 그렇기 때문에(컴파일러 입장에서는 변수가 nil일 수도 있기 때문에) wrap된 상태에서는 설령 변수에 value값이 있다고 하더라도 바로 value가 출력되지 않는다.(Swift 3.0에서 반영된 사항)
var optionalString: String? = “Hello”
print(optionalString)
// 출력 결과: Optional(“Hello”)