🍃 출처 : 앨런 swift 문법 마스터 스쿨
- 값이 있을 수도 있고, 없을 수도 있다.
- 값이 있을 수도 있고, 없을 수도 있는 변수를 정의할 때에는 타입 어노테이션에 ? 를 붙여야 한다.
- 초기값을 지정하지 않으면 기본값은 nil
var yourName: String print(yourName) // 컴파일 에러 // <yourName>의 메모리 공간에 값이 없는데 접근해서 프린트 하려고 하는 것. var yourName: String? print(yourName) //nil (값이 없음, 실제로 없는 건 아님) // 그래서 이렇게 옵셔널 이라는 임시값을 넣어 강제종료가 되지 않게 하는 것
✨ 문자열 "" 은 값이 없는 것이고, 빈 값이 아니다 ✨ 정수형 0은 0 이라는 값이 있는 것이고, 빈 값이 아니다 ✨ String과 String? 은 아예 다른 데이터 타입이다
예시
var num: Int?
var str: String? = "안녕하세요"
print(num) // nil
print(str) // Optional("안녕하세요")
- nil이 아닌 값이 있다는 것을 확신하고 강제로 값을 추출 (값이 없는 경우 에러)
num!
- if문을 통해 nil이 아님을 먼저 확인 후, 강제 추출 (에러 가능성이 없어짐)
if num != nil { print(num!) }
- 옵셔널의 값이 존재하는지 검사한 뒤, 존재한다면 그 값을 다른 변수에 대입
-if let / if var
옵셔널의 값을 벗겨서 값이 있다면 if 문 안으로 들어가고, nil 이라면 그냥 통과if let s = str { print(s) }
var optionalName: String? = "양정인" //옵셔널양정인 if let name = optionalName { print(name) //양정인 (nil이면 프린트안됨) } func doSomething(name: String?) { guard let name = optionalName else { return } print(name) } doSomething(name: "hello")
- 옵셔널 표현식 뒤에 기본값을 제시해서, 옵셔널의 가능성을 없앰
(디폴트 값 제시가능한 경우)optionalName ?? "양정인"
- 앞의 옵셔널 표현식이 nil이라면, 기본값을 제시
var serverName: String? = "홍길동"
var userName = serverName ?? "미인증사용자" // String타입
- 표현식 자체가 옵셔널의 가능성이 있다는 것을 표현. 체이닝의 결과는 항상 옵셔널
(옵셔널 타입에 대해 접근연산자 사용은 항상 ?를 붙임)human?.choco?name
- 언래핑 후 사용해야 함
- chaining의 뜻이 "연쇄" 이듯이,
옵셔널 체이닝은 말 그대로 옵셔널을 연쇄적으로 사용하는 것- .(dot)을 통해 내부 프로퍼티나 메서드에 연속적으로 접근할 때
옵셔널 값이 하나라도 껴 있으면 그것은 옵셔널 체이닝,, 안껴잇음 아님
class Dog {
var name: String?
var weight: Int
init(name: String, weight: Int) {
self.name = name
self.weight = weight
}
func sit() {
print("\(self.name)가 앉았습니다.")
}
func layDown() {
print("누웠습니다.")
}
}
class Human {
var dog: Dog?
}
// 옵셔널타입에 대해, "접근연산자"를 사용할때, ?(물음표)를 붙여서, 앞의 타입이 값이 nil을 가질 수도 있음을 표시
var choco = Dog(name: "초코", weight: 15)
choco.name
choco.sit()
//choco?.name = "초코얌"
//choco?.sit() // Optional("초코얌")가 앉았습니다.